一、为什么小数运算会出错
实际上,不是运算本身会出错,而是计算机根本就不能精确地表示很多数,比如0.1这个数。计算机是用一种二进制格式存储小数的,这个二进制格式不能精确表示0.1,它只能表示一个非常接近0.1但又不等于0.1的一个数。数字都不能精确表示,在不精确数字上的运算结果不精确也就不足为奇了。
我们会发现使用
0.1f+0.1f=0.2
0.1f*0.1f=0.010000001
第一行输出0.2,第二行输出0.010000001。按照上面的说法,第一行的结果应该也不对。其实,这只是Java语言给我们造成的假象,计算结果其实也是不精确的,但是由于结果和0.2足够接近,在输出的时候,Java选择了输出0.2这个看上去非常精简的数字,而不是一个中间有很多0的小数。在误差足够小的时候,结果看上去是精确的,但不精确其实才是常态。
二、解决办法
如果真的需要比较高的精度,一种方法是将小数转化为整数进行运算,运算结束后再转化为小数;另一种方法是使用十进制的数据类型,这个并没有统一的规范。在Java中是BigDecimal;
BigDecima使用详解