gpt4 book ai didi

python - 如何可靠地将数字的小数部分和浮点部分分开?

转载 作者:太空宇宙 更新时间:2023-11-03 13:32:19 25 4
gpt4 key购买 nike

这不是 this 的副本,我会在这里解释。

考虑 x = 1.2。我想将它分成 10.2。我已经尝试了链接问题中概述的所有这些方法:

In [370]: x = 1.2

In [371]: divmod(x, 1)
Out[371]: (1.0, 0.19999999999999996)

In [372]: math.modf(x)
Out[372]: (0.19999999999999996, 1.0)

In [373]: x - int(x)
Out[373]: 0.19999999999999996

In [374]: x - int(str(x).split('.')[0])
Out[374]: 0.19999999999999996

我尝试的所有操作都没有准确地给出 10.2

有什么方法可以可靠地将 float 转换为十进制和 float ,而不受浮点表示法的限制?

我知道这可能是由于数字本身存储方式的限制,所以我愿意接受任何解决这个问题的建议(比如包裹或其他方式)。

编辑:如果可能,我更喜欢一种不涉及字符串操作的方式。

最佳答案

解决方案

这看起来像是 hack,但您可以分离字符串形式(实际上是 repr)并将其转换回整数和 float :

In [1]: x = 1.2

In [2]: s = repr(x)

In [3]: p, q = s.split('.')

In [4]: int(p)
Out[4]: 1

In [5]: float('.' + q)
Out[5]: 0.2

工作原理

以这种方式接近它的原因是 internal algorithm用于显示 1.2 非常复杂(David Gay's algorithm 的快速变体)。它努力显示无法准确表示的数字的最短可能表示形式。通过拆分 repr 形式,您可以利用该算法。

在内部,输入为 1.2 的值存储为二进制分数,5404319552844595/4503599627370496 实际上等于 1.199999999999999955591079014993738383054733276536718 Gay 算法用于将其显示为字符串 1.2split 然后可靠地提取整数部分。

In [6]: from decimal import Decimal

In [7]: Decimal(1.2)
Out[7]: Decimal('1.1999999999999999555910790149937383830547332763671875')

In [8]: (1.2).as_integer_ratio()
Out[8]: (5404319552844595, 4503599627370496)

原理及问题分析

如前所述,您的问题大致转化为“我想拆分数字的整数部分和小数部分,因为它在视觉上显示,而不是根据它的实际存储方式”。

以这种方式构建,很明显解决方案涉及解析它的视觉显示方式。虽然这让人感觉像是黑客,但这是利用非常复杂的显示算法并实际匹配您所看到的内容的最直接方式。

除非您手动重现内部显示算法,否则这种方式可能是匹配您所见内容的唯一可靠方式。

替代方案失败

如果您想留在整数领域,您可以尝试舍入和减法,但这会给浮点部分带来意想不到的值:

In [9]: round(x)
Out[9]: 1.0

In [10]: x - round(x)
Out[10]: 0.19999999999999996

关于python - 如何可靠地将数字的小数部分和浮点部分分开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45194587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com