Android:java舍入错误.无法理解为什么?

前端之家收集整理的这篇文章主要介绍了Android:java舍入错误.无法理解为什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
任何人都能解释为什么地球上这些“相同”的表达式会返回不同的值吗?
(new BigDecimal(String.valueOf(131.7d))).multiply(new BigDecimal(String.valueOf(0.95d))).doubleValue() = 125.115

(new BigDecimal(               131.7d )).multiply(new BigDecimal(               0.95d )).doubleValue() = 125.11499999999998

BigDecimal在它们之间有什么不同?

解决方法

如果您阅读API文档,您会发现taht String.valueOf(dobule)使用Double.toString(double)来格式化值.它可能并不明显,但Double.toString(double)将值格式化,然后将其格式化为字符串:

How many digits must be printed for the fractional part of m or a?@H_403_12@ There must be at least one digit to represent the fractional part,and@H_403_12@ beyond that as many,but only as many,more digits as are needed to@H_403_12@ uniquely distinguish the argument value from adjacent values of type@H_403_12@ double. That is,suppose that x is the exact mathematical value@H_403_12@ represented by the decimal representation produced by this method for@H_403_12@ a finite nonzero argument d. Then d must be the double value nearest@H_403_12@ to x; or if two double values are equally close to x,then d must be@H_403_12@ one of them and the least significant bit of the significand of d must@H_403_12@ be 0.

结果是String.valueOf(131.7d)将返回字符串“131.7”,即使参数的确切值是131.69999999999998863131622783839702606201171875.原因是十进制分数不能总是使用二进制分数精确表示(与浮点数和双精度数一起使用).

因此,新的BigDecimal(String.valueOf(131.7))将创建一个精确值为131.7的BigDecimal. new BigDecimal(131.7)将创建一个具有精确值131.69999999999998863131622783839702606201171875的BigDecimal.

原文链接:https://www.f2er.com/android/316771.html

猜你在找的Android相关文章