列如:9.6 * 9
理应得到 86.4
结果是 86.399999999999
我知道好像是因为有些小数在计算机中的表示不是准确值,所以会出现这种情况。
但是我想得到 86.4
这样的结果,因为算出来的数不确定有几位小数,所以也不好设 double
小数点后的位数,求大神解答疑惑。
用BigDecimal
BigDecimal a = new BigDecimal(Double.toString(9.6));
BigDecimal b = new BigDecimal(Double.toString(9));
System.out.println("" + a.multiply(b));
Output:
86.40
java的float不是一个精确的数值,9.6只是一个无限接近于9.6的数。1.0也是一个无限接近于1.0的小数。
想要得到精确的数字我知道的可以用BigInteger,BigFloat这样的类来解决。
继续推荐我的博客:
- 代码之谜(四)- 浮点数(从惊讶到思考)
- 代码之谜(五)- 浮点数(谁偷了你的精度?)
所以,使用 BigDecimal
类。
对于 @besto 的回答。看过 JDK 文档和源码的都应该知道 Double.toString(9.6)
有很大的安全隐患。因为浮点数 9.6
本来就不是精确的。
正确的写法:
BigDecimal a = new BigDecimal("9.6"));
BigDecimal b = new BigDecimal("9"));
System.out.println("" + a.multiply(b));