Python的数学模块包含方便的函数,如floor和ceil。这些函数接受一个浮点数,并返回该浮点数下面或上面最接近的整数。然而,这些函数以浮点数的形式返回答案。例如:
import math
f=math.floor(2.3)
现在f返回:
2.0
从这个浮点数中获取一个整数,而不存在舍入错误的风险(例如,如果浮点数等于1.99999),或者我应该完全使用另一个函数,最安全的方法是什么?
Python的数学模块包含方便的函数,如floor和ceil。这些函数接受一个浮点数,并返回该浮点数下面或上面最接近的整数。然而,这些函数以浮点数的形式返回答案。例如:
import math
f=math.floor(2.3)
现在f返回:
2.0
从这个浮点数中获取一个整数,而不存在舍入错误的风险(例如,如果浮点数等于1.99999),或者我应该完全使用另一个函数,最安全的方法是什么?
当前回答
数学。Floor将始终返回一个整数,因此int(math.floor(some_float))将永远不会引入舍入错误。
不过,舍入错误可能已经在math.floor(some_large_float)中引入,甚至在首先将一个大数存储在浮点数中时也引入了。(较大的数字在浮点数中存储时可能会失去精度。)
其他回答
使用int(你的非整数)将解决它。
print int(2.3) # "2"
print int(math.sqrt(5)) # "2"
数学。Floor将始终返回一个整数,因此int(math.floor(some_float))将永远不会引入舍入错误。
不过,舍入错误可能已经在math.floor(some_large_float)中引入,甚至在首先将一个大数存储在浮点数中时也引入了。(较大的数字在浮点数中存储时可能会失去精度。)
所有可以用浮点数表示的整数都有精确的表示法。所以你可以安全地对结果使用int。只有当您试图表示一个分母不是2的幂的有理数时,才会出现不精确的表示。
这是不琐碎的工作在所有!IEEE浮点表表法的一个性质是:int(floor(2.3))的大小足够小,那么int(floor(2.3)) =⌊⌋。但在不同的情况下,int(floor(2.3))可能是1。
引用维基百科,
任何绝对值小于等于224的整数都可以用单精度格式精确表示,任何绝对值小于等于253的整数都可以用双精度格式精确表示。
你可以使用round函数。如果您不使用第二个参数(有效数字#),那么我认为您将得到您想要的行为。
闲置的输出。
>>> round(2.99999999999)
3
>>> round(2.6)
3
>>> round(2.5)
3
>>> round(2.4)
2
结合前面的两个结果,我们得到:
int(round(some_float))
这相当可靠地将浮点数转换为整数。