【问题标题】:How to convert float to fixed point decimal in python如何在python中将浮点数转换为定点小数
【发布时间】:2017-07-17 05:52:54
【问题描述】:

我有一些库函数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

问题:

如何将任意浮点数转换为带 2 个小数位的固定小数点?并且无需使用str 进行中间字符串转换。

我不担心性能。只是想确认中间str转换是否是pythonic方式。

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

# 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-base 解决方案更易于读写。但请记住,它仅适用于 Python 3:在 Python 2 上,roundDecimal 实例返回 float
  • 谢谢!编辑做笔记。

标签: python python-3.x floating-point decimal precision


【解决方案1】:

使用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 超过 str 是否有令人信服的理由?
  • @ChristianDean 因为str 不能保证给出 2 位小数。
  • 啊,我明白了。我不知道。
猜你喜欢
  • 2016-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多