【问题标题】:Will casting an "integer" float to int always return the closest integer?将“整数”浮点数转换为 int 总是返回最接近的整数吗?
【发布时间】:2015-11-25 13:42:23
【问题描述】:

我通过将两个数字相除得到一个浮点数。我知道数字是可整除的,所以我总是有一个整数,只是它的类型是浮点数。但是,我需要一个实际的 int 类型。我知道int() 会去掉小数点(即四舍五入)。我担心,由于浮动不准确,如果我这样做,例如int(12./3)int(round(12./3)) 最终可能是 3 而不是 4,因为 4 的浮点表示可能是 3.9999999593519561(这不是,只是一个示例)。

这会发生吗?我可以确保它不会发生吗?

(我问是因为在重塑 numpy 数组时,我收到警告说形状必须是整数,而不是浮点数。)

【问题讨论】:

  • 为什么不简单地使用整数除法?
  • 是的,我刚发帖后就想到了。正要更新问题,但我会让你的评论来代替。
  • 不过,如果我这样做,例如3.5/0.5 那么这是不可能的。 (我没有,我将两个整数相除,但为了论证......)
  • 如果您的期望符合语言的语义,则将浮点数转换为 int 将始终返回您期望的 int。由于您没有解释您的期望是什么,我们怎么可能知道您的期望是否与语言的语义相匹配?
  • @JohnColeman,谢谢,我现在更新了标题。我认为在查看示例时,问题中的含义已经充分表达了,但永远不会太清楚,而且标题含糊不清。

标签: python


【解决方案1】:

float 转换为integer 会截断值,因此如果您有3.999998,然后您将其转换为integer,您会得到3

防止这种情况的方法是对结果进行四舍五入。 int(round(3.99998)) = 4,因为 round 函数总是返回一个精确的整数值。

【讨论】:

  • round函数返回float时如何返回精确的整数值?
  • 浮点数类似于长度有限的十进制数,除了使用二进制数字而不是数字 0-9。它可以精确地保存整数值,例如 3453.0。有很多数字不能精确保存,比如 1/3 = 0.3333...,因为它的长度是有限的。
  • @cmeeren:这个答案的主旨是正确的,对于您提出的问题。确实,round 不会在浮点值接近舍入边界的情况下给出“直观”的结果,例如round(2.675, 2)(此示例在文档中给出)。但是您的问题明确规定您知道您的价值观应该是完整的,并且这些值将按预期四舍五入。
【解决方案2】:

可以通过在相关值上加上 0.5 来模拟舍入。例如:

>>> int(3.4)
3
>>> int(3.7)
3
>>> int(3.4 + 0.5)  # 3.9
3
>>> int(3.7 + 0.5)  # 4.2
4

【讨论】:

  • 在 C 中,将 0.5 加到一个数字的舍入失败,因为 1) 许多负数,2) 刚好小于 0.5 的数字,3) 许多 floatnumbers 的 ULP 为 0.5 4) 许多 @987654323 @ ULP 为 1.0 的值。怀疑python有类似问题。
  • 这些特殊情况都不是由 OP 的代码生成的。
【解决方案3】:

我最终使用了整数除法 (a//b),因为我对整数进行了除法。如果我分开就行不通了,例如3.5/0.5=7。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    相关资源
    最近更新 更多