如何在Python中将浮点数转换为定点小数

3

我有一个库函数foo,它返回一个保留两位小数的浮点数(代表价格)。我需要将其传递给另一个函数bar,该函数期望一个带有固定小数点的十进制数,保留两位小数。

value = foo() # say value is 50.15
decimal_value = decimal.Decimal(value) # Not expected. decimal_value contains Decimal('50.14999999999999857891452847979962825775146484375')
bar(decimal_value) # Will not work as expected

# One possible solution
value = foo() # say value is 50.15
decimal_value = decimal.Decimal(str(round(value,2))) # Now decimal_value contains Decimal('50.15') as expected
bar(decimal_value) # Will work as expected

问题:

如何将任意浮点数转换为带有两位小数的固定小数点? 而且不使用中间字符串转换,也不必担心性能。只是要确认中间字符串转换是否符合Python风格。

更新:其他可能的解决方案

# From selected answer
v = 50.15
d = Decimal(v).quantize(Decimal('1.00'))

# Using round (Does not work in python2)
d = round(Decimal(v), 2)

我喜欢“round”解决方案,因为它比“quantize”基础解决方案更易于阅读和编写。但请记住,它仅适用于Python 3:在Python 2上,“round”一个“Decimal”实例会返回一个“float”。 - Mark Dickinson
谢谢!编辑以添加注释。 - balki
1个回答

6

使用Decimal.quantize函数:

返回第一个操作数四舍五入并具有第二个操作数指定的指数的值。

>>> from decimal import Decimal
>>> Decimal(50.15)
Decimal('50.14999999999999857891452847979962825775146484375')
>>> Decimal(50.15).quantize(Decimal('1.00'))
Decimal('50.15')

与糟糕的str方法不同,此方法适用于任何数字:
>>> decimal.Decimal(str(50.0))
Decimal('50.0')
>>> decimal.Decimal(50.0).quantize(decimal.Decimal('1.00'))
Decimal('50.00')

但是为什么不直接使用 str 呢?使用 Decimal.quantize 有什么强制性的理由吗? - Christian Dean
@ChristianDean 因为 str 不能保证给出2位小数。 - Antti Haapala -- Слава Україні
啊,我明白了。我不知道那个。 - Christian Dean

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