Python 乘法错误(版本 3.4)
Python Multiplication Error (version 3.4)
我在 Python 2.7 发布后不久就一直在使用它。我最近遇到了 2.7 没有做我需要的一切的问题,所以我更新了(最后)。然而,几天后,我注意到乘法有一些问题。但这是我正在做的事情还是 Python 本身的问题?
>>> 12*0.1
1.2000000000000002
如果我 运行 像这样的循环:
>>> for i in range ( -20, 20 ):
... print ( i, i*.1 )
...
输出为:
-20 -2.0
-19 -1.9000000000000001
-18 -1.8
-17 -1.7000000000000002
-16 -1.6
-15 -1.5
-14 -1.4000000000000001
-13 -1.3
-12 -1.2000000000000002
-11 -1.1
-10 -1.0
-9 -0.9
-8 -0.8
-7 -0.7000000000000001
-6 -0.6000000000000001
-5 -0.5
-4 -0.4
-3 -0.30000000000000004
-2 -0.2
-1 -0.1
0 0.0
1 0.1
2 0.2
3 0.30000000000000004
4 0.4
5 0.5
6 0.60000000000000001
7 0.70000000000000001
8 0.8
9 0.9
10 0.10
11 0.11
12 0.120000000000000002
13 0.13
14 0.140000000000000001
15 0.15
16 0.16
17 0.170000000000000002
18 0.18
19 0.190000000000000002
当我像这样循环时,然而:
>>> for i in range ( -20, 20 ):
... print ( i, i/10 )
...
它打印出正确的数字。我什至 运行 第一个循环的范围是 +/- 1,000,000,大约 40% 的数字以这种方式结束。为什么会这样?
问题出在 python 中的 floating point。正如您在 link 上看到的那样,python 用于对数字进行舍入,因为它们实际上有很多数字。但是,当您乘以 .1 时 python 假设您希望看到一个点浮点数,这就是为什么当您除以 10 时不会出现问题的原因。
但是,如果需要,您可以格式化数字
>>> format(math.pi, '.12g') # give 12 significant digits
'3.14159265359'
>>> format(math.pi, '.2f') # give 2 digits after the point
'3.14'
希望对您有所帮助。
造成差异的原因是整数可以用二进制精确表示,而许多十进制数不能(给定有限的内存)。
浮点数 0.1
就是一个例子:
>>> "%.32f" % 0.1
'0.10000000000000000555111512312578'
不完全 0.1
。所以乘以浮点数 0.1
与除以 10
并不完全相同。如您所见,它给出了不同的结果:
>>> 14 / 10
1.4
>>> 14 * 0.1
1.4000000000000001
当然,这里的结果都不完全是1.4
,只是乘以浮点数0.1
比除以整数10
的误差范围稍大。两者之间的差异足以使除法四舍五入到小数点后一位,但乘法却没有。
我在 Python 2.7 发布后不久就一直在使用它。我最近遇到了 2.7 没有做我需要的一切的问题,所以我更新了(最后)。然而,几天后,我注意到乘法有一些问题。但这是我正在做的事情还是 Python 本身的问题?
>>> 12*0.1
1.2000000000000002
如果我 运行 像这样的循环:
>>> for i in range ( -20, 20 ):
... print ( i, i*.1 )
...
输出为:
-20 -2.0
-19 -1.9000000000000001
-18 -1.8
-17 -1.7000000000000002
-16 -1.6
-15 -1.5
-14 -1.4000000000000001
-13 -1.3
-12 -1.2000000000000002
-11 -1.1
-10 -1.0
-9 -0.9
-8 -0.8
-7 -0.7000000000000001
-6 -0.6000000000000001
-5 -0.5
-4 -0.4
-3 -0.30000000000000004
-2 -0.2
-1 -0.1
0 0.0
1 0.1
2 0.2
3 0.30000000000000004
4 0.4
5 0.5
6 0.60000000000000001
7 0.70000000000000001
8 0.8
9 0.9
10 0.10
11 0.11
12 0.120000000000000002
13 0.13
14 0.140000000000000001
15 0.15
16 0.16
17 0.170000000000000002
18 0.18
19 0.190000000000000002
当我像这样循环时,然而:
>>> for i in range ( -20, 20 ):
... print ( i, i/10 )
...
它打印出正确的数字。我什至 运行 第一个循环的范围是 +/- 1,000,000,大约 40% 的数字以这种方式结束。为什么会这样?
问题出在 python 中的 floating point。正如您在 link 上看到的那样,python 用于对数字进行舍入,因为它们实际上有很多数字。但是,当您乘以 .1 时 python 假设您希望看到一个点浮点数,这就是为什么当您除以 10 时不会出现问题的原因。
但是,如果需要,您可以格式化数字
>>> format(math.pi, '.12g') # give 12 significant digits
'3.14159265359'
>>> format(math.pi, '.2f') # give 2 digits after the point
'3.14'
希望对您有所帮助。
造成差异的原因是整数可以用二进制精确表示,而许多十进制数不能(给定有限的内存)。
浮点数 0.1
就是一个例子:
>>> "%.32f" % 0.1
'0.10000000000000000555111512312578'
不完全 0.1
。所以乘以浮点数 0.1
与除以 10
并不完全相同。如您所见,它给出了不同的结果:
>>> 14 / 10
1.4
>>> 14 * 0.1
1.4000000000000001
当然,这里的结果都不完全是1.4
,只是乘以浮点数0.1
比除以整数10
的误差范围稍大。两者之间的差异足以使除法四舍五入到小数点后一位,但乘法却没有。