【问题标题】:When is there "data loss" when converting from BigDecimal to Double in Java在 Java 中从 BigDecimal 转换为 Double 时何时会出现“数据丢失”
【发布时间】:2018-10-05 10:13:56
【问题描述】:

我知道在 Java 中将 BigDecimal 值转换为 Double 时存在“精度问题”。使用 BigDecimal.doubleValue() 简单地将 BigDecimal 转换为 Double 时,何时会出现“数据丢失”?例如,如果我将 1.1 从 BigDecimal 转换为 Double 并打印出来,它会打印“1.1”,我认为这不会丢失数据(BigDecimal 为 1.1,打印值为 1.1)。以这种方式简单地将 BigDecimal 转换为 Double 时,这两个值在什么情况下会不一样?

【问题讨论】:

  • 如果在打印时选择更高的精度,你会看到双精度非常接近,但不完全是 1.1,因为二进制浮点数不能精确表示 1.1,而 BigDecimal 可以。所以会有精度损失。 double 只有有限的位数,而 BigDecimal 几乎是无限的位数这一事实也应该是一个提示。

标签: java string double converter bigdecimal


【解决方案1】:

BigDecimal 有你喜欢的精度。 double 具有 53 位二进制精度,即约 15.9 个十进制数字。因此,只要您的 BigDecimal 的有效数字大于 16 位,您在转换为 double 时就会丢失精度。

[这是指整数值。分数的情况要复杂得多,但事实仍然是BigDecimal 具有无限精度,而double 则没有。]

double 也有最小值和最大值,由Double.MIN_VALUE/MAX_VALUE 给出。 BigDecimal 两者都没有。

【讨论】:

  • 除此之外还有其他情况吗?
  • 精度和范围。没有别的了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 2019-09-29
  • 1970-01-01
相关资源
最近更新 更多