为什么有些数字在存储为浮点数时会失去准确性?
例如,十进制数9.2可以精确地表示为两个十进制整数(92/10)的比率,两者都可以用二进制(0b1011100/0b1010)精确表示.但是,存储为浮点数的相同比率永远不会完全等于9.2:
32-bit "single precision" float: 9.19999980926513671875
64-bit "double precision" float: 9.199999999999999289457264239899814128875732421875
Run Code Online (Sandbox Code Playgroud)
这样一个看似简单的数字如何在64位内存中表达"太大" ?
我是Python的初学者,我有一个问题.
为什么舍入一个数字,如5.5,7.5,(任何).5与奇数整数部分应用round(num)正常工作(规则5/4),但舍入数字像(任何).5与非奇数整数部分由同一函数返回整数部分?(但是如果我们在这个十进制数字上添加一个像0.000000001这样的小数字就能正常工作)
我的意思是下一个:
round(9.5)
Run Code Online (Sandbox Code Playgroud)
返回10,这是正确的.但
round(8.5)
Run Code Online (Sandbox Code Playgroud)
返回8,这是不正确的.和
round(8.5 + 0.0000000000001)
Run Code Online (Sandbox Code Playgroud)
返回9.
为什么它不正确?
我在Windows上使用Python 3.2.2.
这个问题是关于numpy.rint,根据定义,该值将四舍五入到最接近的整数。但是,以下代码会产生不一致的结果。
In [1]: import numpy as np
for i in range(5, 105, 10):
print(i, np.rint(i/10))
Out[1]: 5 0 # Should be 1
15 2 # Correct
25 2 # Should be 3
35 4 # Correct
45 4 # Should be 5
55 6 # Correct
65 6 # Should be 7
...
Run Code Online (Sandbox Code Playgroud)
因此,似乎存在一种模式:如果除以10后,单位位置是偶数,则将数字四舍五入,但如果单位位置是奇数,则将数字四舍五入。但是,根据四舍五入规则,单位位置应该没有关系!
要么numpy使用“四舍五入”,即正好一半,四舍五入到下一个整数,要么使用“四舍五入”。它不能同时做到,而且前后不一致。
通常,我会为此打开一个错误报告numpy,但是我不确定这是numpy不是很奇怪,或者是关于python解释浮点数的一些潜在的怪癖,还是由于转换到二进制和返回时的精度损失。
请注意,numpy.round(i, 0)其行为也相同。
解决方法是在除以10:之后添加一小部分numpy.rint(i/10 + 0.1),然后答案正确。