刚刚遇到个需求,需要对金额求和,上线的时候才知道这时个,这个字段是个小数。
随手就改了个Double ,然后,跑下,没啥问题,直接上线了
然后,就fuck 了
加出一大堆的小数,大概是这样的
package com.venn.demo; public class DoublePlus { public static void main(String[] args) {
double d1 = 0.01;
double d2 = 0.01; for (int i=0; i< 10; i++){
d2 += d1;
System.out.println(d2);
}
}
}
我以为的输出是这样的:
0.02
0.03
0.04
0.05
0.06
0.07
0.08
0.09
0.10
0.11
实际是这样的:
0.02
0.03
0.04
0.05
0.060000000000000005
0.07
0.08
0.09
0.09999999999999999
0.10999999999999999
一脸懵逼的看完一篇博客,似懂非懂的:程序员必知之浮点数运算原理详解
结论就是:
很多十进制小数在转换成二进制时,并不能精确表示,只能是近似值。
解决办法就是使用BIgDecimal
public static void bigDecimalDemo(){ BigDecimal b1 = new BigDecimal("0.01");
BigDecimal b2 = new BigDecimal("0.01"); for (int i=0; i< 10; i++){
b2 = b2.add(b1);
System.out.println(b2);
} }
输出如下:
0.02
0.03
0.04
0.05
0.06
0.07
0.08
0.09
0.10
0.11