gpt4 book ai didi

python - 有没有另一种方法可以在不调用 round() 的情况下削减小数点后 10 位的数字?

转载 作者:行者123 更新时间:2023-12-01 23:30:32 24 4
gpt4 key购买 nike

我想创建一个函数,无论输入的数字是多少,它都会截断(不是舍入,这可能会增加一些小数)第 10 个数字之后的每个数字。它通常工作正常,但如果我用这样的数字调用函数:

1234567.123456789123456789

它返回:1234567.1234567892

而不是预期的 1234567.1234567891。

def cut_to_10(number):
number = str(number)
j = 0
if "." in number:
for i in number:
j += 1
if i == ".":
before_dot = number[:j - 1]
after_dot = number[j:]
if len(after_dot) > 10:
after_dot = after_dot[:10]

return float(before_dot + "." + after_dot)

if "." not in number:
return round(float(number), 10)

编辑 1:

也试过这个,同样返回了意想不到的结果。

import numpy as np

def cut_to_10(number):
return np.floor(number * 1e10) / 1e10

编辑 2:

考虑到 ShadowRanger 给出的惊人解释,但是,同时考虑到我需要比地板精度更高的天花板精度,并且考虑到我仍然必须使用 float 这一事实,我只是决定改变

返回 float (before_dot + "."+ after_dot)

返回 float (before_dot + "."+ after_dot)- 2e-10

而且效果很好。 1e-10 无效。

最佳答案

1234567.123456789123456789 不是实际的 float。您可以键入它,但它变成1234567.1234567892,最接近的可表示float值;舍入发生在您实际调用 round 之前。

>>> 1234567.123456789123456789
1234567.1234567892

如果你需要那么高的精度,你需要移动到 decimal.Decimal,它会工作得很好:

>>> decimal.Decimal('1234567.123456789123456789')
Decimal('1234567.123456789123456789')

>>> round(_, 10)
Decimal('1234567.1234567891')

只是不要转换回 float,因为 1234567.1234567891 不存在(如果存在,这就是 1234567.123456789123456789 会产生的结果),然后您将回到从 1234567.1234567892 开始的地方。

关于python - 有没有另一种方法可以在不调用 round() 的情况下削减小数点后 10 位的数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66344043/

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