1 出现的问题
最近的做的一个需要是要统计订单表当天和一个月所有商户的利润总,但是在用double累加的时候数据汇出现一点点的误差。
所以想搞清楚这里面的原因。
2 原因说明
double属于floating binary point types(浮点二进制类型),也就是说都double型的数值在相加减的时候,会将数值转换成二进制的数值如10001.10010110011这种表示发再做相加减,但是在转换成二进制代码表示的时候,存储小数部分的位数会有不够的现象,即无限循环小数,这就是造成微差距的主要原因。
3 解决办法
1.只取需要用到的位数:
小数点台后面的位数部分就不要管了,不过这种方法不太好。
2.Java的话使用BigDecimal类型:
用BigDecimal就不会出现上面的问题了,可以准确的计算小数值.
BigDecimal类型超过16位有效位的数进行精确的运算(28位),而double类型的16位,所以BigDecimal类型比Double类型能表示更精确的浮点数。