(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在它们之间有什么不同?
解决方法
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.