谁能解释为什么这些“相同”的表达式返回不同的值?
(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文档,则会发现String.valueOf(dobule)
使用Double.toString(double)
格式化该值。这可能并不明显,但是Double.toString(double)
将值四舍五入,然后将其格式化为字符串:
m或a的小数部分必须打印多少个数字?
必须至少有一位数字来表示小数部分,并且
超过所需的位数,但仅需要更多位数
唯一地将参数值与类型的相邻值区分开
双。也就是说,假设x是精确的数学值
用此方法产生的十进制表示形式表示
有限的非零参数d。然后d必须是最接近的double值
到x;或者,如果两个double值均相等地接近x,则d必须为
其中之一和d的最低有效位必须
为0。
结果是,即使参数的确切值为131.69999999999998868861131622783839702606201171875,String.valueOf(131.7d)
仍将返回字符串“131.7”。这样做的原因是,十进制小数不能始终使用二进制小数来精确表示(与浮点数和双精度数一起使用)。
因此,新的new BigDecimal(String.valueOf(131.7))
将创建一个确切值为131.7的BigDecimal。 new BigDecimal(131.7)
将创建一个BigDecimal,其精确值是131.69999999999998863131622783839702606201171875。