我们在java代码里写入这么一句代码:
System.out.println(1.2-1.1);
运行它,结果出来了,却不是预期的0.1。
这是为什么呢?
这是由计算机本身二进制结构导致的结果。在十进制中,1.1是有穷尽的小数,但是用计算机表达的时候,会被自动翻译成二进制,也就是1.0001100110011...
1.2也是如此,二进制是1.001100110011..
.两者相减,也就是约等于(1.001100110011...-1.0001100110011...=0.0001100110011...)
当计算机再把0.0001100110011...这个结果翻译成10进制的时候,就得到了让人诧异的0.09999999999999987。
这个问题让我想起了大学里数据结构课程中,用数组模拟大数字四则运算的代码……怀念~
很多时候,大家在程序设计里,一不小心就会碰到这个问题(算钱不正确等等现象),但是怎么也找不到问题究竟发生在哪里。最后才发现问题原来出在这里!
即便你知道java有这么个问题存在,但是写代码的时候一不小心就忽视了它,导致bug发生。希望大家能够避免类似情况发生。(例如设计的时候就考虑到,用Java的BigDecimal类去实现相关计算。)
来源:CSDN
作者:jun1987929
链接:https://blog.csdn.net/jun1987929/article/details/7712325