刚刚遇到个需求,需要对金额求和,上线的时候才知道这时个,这个字段是个小数。
随手就改了个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
来源:https://www.cnblogs.com/Springmoon-venn/p/10118412.html