首页 > 解决方案 > Python 使用什么舍入规则将浮点数转换为整数?

问题描述

编辑:发布此问题后,很明显我对旧语言中发生的事情的记忆是错误的,并且没有根本区别,因为我刚刚通过运行等效的 Fortran 程序进行了验证。简而言之,我的前提是错误的。我已决定将问题保留下来,以便其他有相关问题的人可以看到回复。

原始帖子:与我使用过的早期编程语言(Fortran、C、IDL 等)相比,Python 在将浮点数转换为整数时似乎更聪明地进行智能舍入。例如,在许多语言中,相当于

x = 1./3.
y = 3.*x
print( int(y))

由于 1./3 的计算被截断而产生 0。但是 Python 返回 1,这通常是首选结果。但是 Python 如何确定何时忽略轻微的截断错误以及何时不忽略呢?我发现有一个明显的精度阈值:

> int(10.999999999999999)
10
> int(10.9999999999999999)
11

第二行只有一个'9'。阈值精度是语言的固定、定义的特性还是依赖于实现?

最好能更好地理解什么时候可以指望 Python 做“正确的事情”,什么时候不能。如前所述,在旧语言中,这是一个需要持续密切关注的问题,因为您知道即使是最轻微的截断错误也会给您带来不同的整数结果,甚至除法和/或乘法的顺序有时也很重要。

附加上下文:当我需要(从浮点数据)计算需要访问的数组元素的索引时,我通常使用从浮点到整数的转换。

标签: pythonfloating-point

解决方案


/在 Python3.x 中,使用运算符的除法总是返回一个float. 这就是为什么1/3不截断为0.

对于您问题的第二部分,实际上并不是将数字四舍五入int的函数。您只是不能以该精度表示 a ,因此它在被赋予功能之前被四舍五入:float11 int

>>> 10.999999999999999
10.999999999999998
>>> 10.9999999999999999
11.0

推荐阅读