从浮点数中提取小数部分

4

我有一个函数,它以浮点数作为输入,输出仅为小数部分。 例如,get_decimal(4.45) 应返回 0.45,我们只返回正数。

我编写了以下代码:

def get_decimal(n): 
    try:
        return float('0.'+(str(n).split('.',1))[1])
    except:
        return 0

这段代码几乎可以工作,但它并没有给出完整的答案。例如,get_decimal(4.566666678258757587577) 只返回了:
0.566666678258757 

改为:

0.566666678258757587577

有没有一种方法可以获取整个数字?

这回答解决了你的问题吗?如何获取小数点后面的数字?(https://dev59.com/km865IYBdhLWcg3wTcpY) - Tomerikoo
你的方法很好。看起来不是同一个数字的原因只是由于打印的限制。尝试 get_decimal(4.566666678258757587577) * 1000 % 1 并查看是否具有所有数字。简单地运行 print(4.566666678258757587577) 也将只显示 4.566666678258757 而不是完整的数字... - Tomerikoo
3个回答

8

使用模运算:

inp = 4.566666678258757587577
output = inp % 1
print(output)    # prints 0.566666678259

请注意,Python的print()函数通常尝试显示浮点数的更加人性化的形式。因此,虽然打印出来的值似乎在12位数字后停止,但实际上还有更多的精度没有显示。
例如:
print((output * 100000) % 1)   # prints 0.667825875724
                               #   4.566666678258757587577  <- original input

非常感谢您提供的解决方案!但是看起来它似乎没有给出完整的小数部分。例如,输出应该是0.566666678258757587577。 - zzz247
@Tim 我认为有一种方法可以调整print()语句的精度,但我不确定。 - user79161
@zzz247 这里的问题在于Python的print()函数,它有一些规则用于确定如何“显示”浮点数。正如我的更新答案所示,完整的精度仍然存在,只是你在控制台看不到它。 - Tim Biegeleisen
你的解决方案很好。但是你有没有想过为什么我的解决方案不起作用? - zzz247
1
在这里定义“工作”。你的解决方案可能确实有效,因为你最终得到了输入浮点数的小数部分。对你来说真正的试金石是使用该小数部分并进行一些数学计算。你的计算是否给出了预期的结果?那么你的方法是有效的。 - Tim Biegeleisen

0
你可以尝试这个:
output = round(inp-int(inp),abs(decimal.Decimal(str(inp)).as_tuple().exponent)

0

你可以使用 Decimal,但在这种情况下,你需要将输入设置为字符串:

from decimal import *

def get_decimal(n): 
    try:
        return Decimal('0.'+(str(n).split('.',1))[1])
    except:
        return 0
print(get_decimal("4.5666666782587575875779"))

输出:

0.5666666782587575875779

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接