概要
今天出现一个问题,235844.46-230000相减,得出的结果出乎意料,出来的结果如截图:
看到这个结果大感意外,尝试更改数值试试:
把235844.46更改为235844.47,然后235844.47-230000=5844.47,咦,居然正常了。
把把235844.46更改为235844.45,然后235844.45-230000=5844.45000000001,哎,又有问题了。
原因
double型的数值在相加减的时候,会先将数值转换成二进制的数值如10001.10010110011,然后再做相加减。但是在转换成二进制代码表示的时候,存储小数部分的位数会有不够的现象,即无限循环小数,这就是造成微差距的主要原因。
解决方法
计算机计算都是二进制数字,首先是将数字转化成二进制数(这样容易造成二进制有可能位数不够的情况)然后再计算,这样就造成了误差,Decimal类型的有效位数达到28位,而double类型的16位;对于一般的数据量不大的计算推荐用Decimal来;