当前位置: 首页 > 面试题库 >

非奇数的Python中的舍入错误?

漆雕升
2023-03-14
问题内容

我是Python的初学者,我有一个问题。
为什么用奇数整数部分round(num)四舍五入像5.5、7.5((任何).5)这样的数字正确工作(规则5/4),但是用同一个函数将非奇数整数部分像(任何).5进行四舍五入只返回整数部分?(但是,如果我们在该十进制数上加上一个像0.000000001这样的小数字,它将正常工作)

我的意思是下一个:

round(9.5)

返回10,这是正确的。但

round(8.5)

返回8,这是不正确的。和

round(8.5 + 0.0000000000001)

返回9。

为什么工作不正确? 我在Windows上使用Python 3.2.2。


问题答案:

Python 3.x都有,相比之下到Python
2.x中,使用银行家舍入的round()功能

这是记录的行为:

如果两个倍数相等接近,则四舍五入取整为偶数选择(例如,round(0.5)和round(-0.5)均为0,而round(1.5)为2)。

由于浮点数本质上仅是近似值,因此如何对待“精确的”半整数无关紧要-前面的计算中总会有舍入误差。

编辑 :要获取旧的舍入行为,可以使用

def my_round(x):
    return int(x + math.copysign(0.5, x))


 类似资料:
  • 我是Python的初学者,我有一个问题。 为什么舍入像5.5、7.5、(anyther).5这样的数字用奇数部分应用是正确的(规则5/4),但是用相同的函数舍入像(anyther).5这样的数字用非奇数部分只返回一个整数部分?(但是如果我们在这个十进制数字上加上一个小数字,比如0.00000000001,它就能正常工作了) 我是说下一个: 返回10,它是正确的。但是

  • 问题内容: 这个问题更多是出于好奇。 我正在创建以下数组: 然后,打印它: 但是,如果删除j,则会得到: 但是,如果我从for中删除j,则会得到: 是因为我使用0.6创建矩阵的方式吗?它如何代表内部真实价值? 问题答案: 这里发生了一些不同的事情。 首先,Python有两种将对象转换为字符串的机制,称为和。 应该提供“忠实”的输出,从而(理想情况下)可以轻松轻松地精确地重新创建该对象,同时旨在提供

  • 问题内容: 我不知道这是否是一个明显的错误,但是在运行Python脚本以更改模拟参数时,我意识到缺少和的结果。在调查中,我注意到以下Python代码: 生成的相同文件的增量= 0.28和0.29,与.57和.58相同,原因是python返回float(29)/ 100为。但这不是系统错误,从某种意义上说,它并不是每个整数都发生的。因此,我创建了以下Python脚本: 而且我看不到发生这种舍入错误的

  • 问题内容: 我知道在浮点算法中会发生舍入错误,但是有人可以解释这一原因: 这在x64上的Python 2和Python 3上都发生。 就我所见,这要么是错误,要么是非常愚蠢的规范,因为我看不出最后一个表达式的求值理由。 为什么不简单定义为? 编辑 :也计算为。至少这是必然的,因为然后评估为 编辑 :这不是浮点数学运算符被破坏吗?因为我在问为什么这个特定的运算会受到(可能是可以避免的)舍入错误,为什

  • 问题内容: 在我的课程中,我被告知: 连续值大约在内存中表示,因此使用浮点数进行计算会产生舍入误差。这些是位模式的微小差异。因此,如果和为浮点,则测试是不安全的。 指的是Java。 这是真的?我已经将比较语句与s和s一起使用,并且从未遇到过舍入问题。我从来没有读过类似的教科书。虚拟机肯定占了这一切吗? 问题答案: 是真的。 这是如何在内存中以有限数量的位表示浮点值的固有限制。 例如,该程序显示“

  • 我不明白为什么这是1.0。它不应该是0.999999999999吗?因此,我提出了一种解决方案,python对其答案进行了自动舍入,但如果大于,则无法解释以下结果。。。 我以为四舍五入错误是因为尾数中使用的位数有限,指数(浮点数),但0.9999~~9也没有超出位数的限制...有人能解释一下为什么这些结果会这样吗?