刚刚遇到个需求,需要对金额求和,上线的时候才知道这时个,这个字段是个小数。
随手就改了个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