python2和python3中直接运算3 * 0.3都会输出0.8999999999999999
Python 2.7.16 (default, Feb 29 2020, 01:55:37)
[GCC 4.2.1 Compatible Apple LLVM 11.0.3 (clang-1103.0.29.20) (-macos10.15-objc- on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 3 * 0.3
0.8999999999999999
Python 3.6.5 (default, Mar 30 2018, 06:41:53)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 3*0.3
0.8999999999999999
这是为什么呢?
其实,大部分语言都有这样的问题,计算机底层都是使用的2进制表达来进行运算;0.3被识别为float
类型,但0.3无法被2的整数进制表示,因为float类型存储位数问题,0.3只能取近似值。
具体0.3转二进制的过程是这样的:
- 0.3 * 2 = 0.6 取整数部分 得 0 ,小数部分继续计算
- 0.6 * 2 = 1.2 得 1
- 0.2 * 2 = 0.4 得 0
- 0.4 * 2 = 0.8 得 0
- 0.8 * 2 = 1.6 得 1
- 0.6 * 2 = 1.2 得 1
- 0.2 * 2 = 0.4 得 0
- 0.4 * 2 = 0.8 得 0
出现循环,0.3 = (0.01001100....)B
其实像0.1、0.7等浮点数字都存在这样的问题, 它们的二进制也无法被2的整数进制表示。