相信小伙伴们在编程的时候会遇到这种问题,在进行浮点数运算有时得到结果会带有一个"小尾巴",就像下面这样:
先跑一段Java代码:
出BUG了吗???
刚学习编程的小伙伴可能会摸不着头脑,经过测试这个问题同样的也会出现在如c/c++,JS,python语言中。
原因分析
其实,这并不是出Bug了,只是因为计算机无法100%准确地存储如0.1、0.2这样的小数,进而导致两个数进行加法运算返回的结果精度也可能会跟着出现问题。下面有更详细的分析:
1.首先了解十进制化二进制的原则:
(1)整数部分对2取余然后逆序排列。(2)小数部分乘2取整数部分,然后顺序排列。
2.先来尝试把十进制的0.1化成二进制得到:
0.1(十进制)= 0.0001100110011…0011…(二进制)
结果将不断循环0011这个片段,计算机将永远都存不下0.1的二进制小数,这就是问题所在了。像单精度浮点型数据用32位存储,双精度浮点型用64位存储,但是它们始终是有限位数,用来存储0.1将不可避免出现精度缺失的问题。只有当存储如1/2、1/4、1/8、3/4、5/8…这种形式的小数时才能准确。所以又推断0.2也会出现无限循环的情况,而结果也确实如此:
0.2(十进制)= 0.0011001100110011…0011…ÿ