不信,你试试运行下面这段代码
float sum = 0; int i; for(i = 1;i<=100;i++){ sum+=0.1; } System.out.println(sum);等等……容我掐指算一算,结果是不是:10.000002
okok,那么这是为什么呢,这还得从……盘古开天地开始说起,盘古抡起了他的大斧子将天地劈开之后,long time after 约翰·冯·诺依曼发明了计算机。计算机内部的所有信息都是以二进制数的形式来处理的,而有一些十进制的小数无法转换成二进制数。举个栗子:0.1。十进制数0.1转换成二进制后,会变成0.00011001100……(1100循环)这样的循环小数。这其实和我们无法用十进制数来表示1/3是一样的道理。so,计算机是无法处理无限循环的小数的。
计算机计算出错的原因之一是,采用浮点数来处理小数(另外,也有因“位溢出”而造成计算错误的情况)。作为程序的数据类型,不管是使用单精度浮点数还是双精度浮点数,都存在计算出错的可能性。
那么我们怎么处理这种情况呢?
1、如果程序对数据的精度要求不高的情况下,完全可以忽略这个问题
2、还可以将小数转换成整数来计算,然后再除以响应的倍数即可
3、采用BCD方法
那么问题又来了,BCD是啥?
BCD码(Binary-Coded Decimal),用4位二进制数来表示1位十进制数中的0~9这10个数码,是一种二进制的数字编码形式,用二进制编码的十进制代码。BCD码这种编码形式利用了四个位元来储存一个十进制的数码,使二进制和十进制之间的转换得以快捷的进行。这种编码技巧最常用于会计系统的设计里,因为会计制度经常需要对很长的数字串作准确的计算。相对于一般的浮点式记数法,采用BCD码,既可保存数值的精确度,又可免去使计算机作浮点运算时所耗费的时间。此外,对于其他需要高精确度的计算,BCD编码亦很常用。