将较大的 int 值转换为浮点数,不向上舍入 [duplicate]

Casting large int value to float with no round up [duplicate]

提问人:alexfilexpo 提问时间:6/30/2023 更新时间:6/30/2023 访问量:45

问:

今天我发现将 int 转换为浮点具有非常有趣的精度和舍入规则。 我有几个数字给了我意想不到的结果:

float(1641016854000000000) -> 1.641016854e+18 (as expected)
float(1641016854000000100) -> 1.641016854e+18 (expected 1.6410168540000001e18)
float(1641016854000000200) -> 1.6410168540000003e+18 (expected 1.6410168540000002e+18)
float(1641016854000000300) -> 1.6410168540000003e+18 (as expected)
float(1641016854000000400) -> 1.6410168540000005e+18 (expected 1.6410168540000004e+18)

所以我的问题是:

  1. 如何防止值四舍五入?
  2. 如何获得预期的结果而不是我现在拥有的结果?
Python 浮点舍 精度 科学记数法

评论

0赞 Scott Hunter 6/30/2023
floats 只有这么高的精度;如果需要更多,请使用其他类型。
0赞 TheDeafOne 6/30/2023
这回答了你的问题吗?在 Python 中提高浮点精度
0赞 CtrlZ 6/30/2023
StackOverflow 充满了关于 float 限制(如果他们认为是这样)的信息。如果您需要更高的精度,请考虑: docs.python.org/3/library/decimal.html
0赞 Elias 6/30/2023
这是 python 的另一篇很好的文章:浮点算术:问题和限制
1赞 STerliakov 6/30/2023
你根本无法在精度内表示。还记得指数和基数都是二进制数吗?尝试这个答案中的函数:在您的数字中,改变值(手动加/减)并返回。这应该解释为什么只有 和 生成,而不是 .1.6410168540000003e-18floatfloat2bin0b1bin2float...2...4...3

答:

1赞 TheDeafOne 6/30/2023 #1

与大多数语言一样,Python 的默认浮点类型只能如此精确以节省内存。这就是为什么在处理极其精确的数字时会出现浮点错误的原因。 避免这种情况的一个好方法是使用 python 的 decimal 库