public static strictfp void main(String[] args) { double d1 = 0d; double d2 = 0d; System.out.println(d1 = 12.51111d); System.out.println(d2 = Math.floor(12.51111d)); System.out.println(d1 - d2); }
控制台打印:
12.51111
12.0
0.5111100000000004
javascript里出现过同样的问题,如:alert((122.9 - 122).toFixed(19)),结果IE和火狐有细微差别。
12.51111-12.0很明显等于0.51111
0.0000000000000004的误差是怎么产生的?
有没有人能说明一下跟本的原因!
java的运算符最后都是把操作数转换成二进制进行计算的。如果是浮点的话再转换成二进制并且进行运算的时候就会出现你上面这样的结果,所以浮点运算建议采用BigDecimal
java double 不是精确类型。建议找本基础的书仔细看看关于java数据类型的解释。
如果需要精确的浮点型,请使用BigDecimal类