【问题标题】:Conflicting decimal value with double data type in java [duplicate]java中的十进制值与双精度数据类型冲突[重复]
【发布时间】:2013-08-06 14:02:42
【问题描述】:

我有一个愚蠢的问题。 为什么这是给 488.15999999999997 而不是 488.16

double dbl = 427.14 + 61.02;
System.out.println(dbl);

我听说如果我们要考虑这么高的准确性(例如与货币相关的逻辑),我们必须使用 BigDecimal。但我想知道这背后的原因。

【问题讨论】:

  • 试试这个IEEE 754 Calculator:粘贴你的十进制值,看看会发生什么。值一千字!
  • 感谢大家的cmets。我注意到这个话题在很多地方都有。但我想知道这背后的确切原因。可以减票。我应得的。但是你的参考对我很有帮助。我在java中获得了很多关于浮点值的知识
  • 当您使用浮点时,您必须应用适当的舍入。如果你这样做,你可以在交易系统中使用 double,大多数银行使用 double 或 long(固定精度)而不是 BigDecimal,尤其是用 C++ 编写的。
  • 的确切原因是,你得到一个数略少于你想到的是,427.14实际上是427.1399999999999863575794734060764312744140625和61.02居然是61.02000000000000312638803734444081783294677734375,当你添加这些你一起寻找最近的双重价值488.15999999999998948396751075051724910736083984375这是稍微低于你的预期。如果将其四舍五入到小数点后 2 位,您将得到预期的答案 488.16

标签: java double


【解决方案1】:

这是“正常”行为。请记住,对于一般情况下,十进制值无法在计算机中精确表示,因此小错误将开始蔓延。看看What Every Computer Scientist Should Know About Floating-Point Arithmetic,任何编写处理十进制值的代码的人都必须阅读它。

【讨论】:

  • “记住,十进制值不能在计算机中精确表示”可以,它只是不是 i> 在 IEEE 754 浮点中。
  • 它可以,如果你有无限的内存。在实际意义上,对于一般情况,它不能。
  • @Óscar:不,这根本不是真的。这只是你想要保留多少个小数位的问题。或者更准确地说,你想要多少个有效数字。要获得与double 大致相同的范围但具有完美的小数精度,您只需要大约 56 个有效数字和一个指示小数点位置的指示符。当然,十进制数也有自己的问题,比如无法准确存储1 / 3。 ;-)
【解决方案2】:

【讨论】:

  • 谢谢RBauer!这对我帮助很大
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-07
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
相关资源
最近更新 更多