从浮点型到小数型的直接转换是在python-2.7中实现的,在Decimal的构造函数和Decimal.from_float()类方法中都是如此。
相反,Python-2.6抛出了一个TypeError,建议首先转换为字符串:
TypeError: Cannot convert float to Decimal. First convert the float to a string因此,我通常的解决方法是:
if sys.version_info < (2, 7):
Decimal.from_float = classmethod(lambda cls, x: cls(str(x)))这只是错误消息的文字翻译-我也不会费心在构造函数中实现它。
如果这么简单,为什么他们不首先实现它,而是告诉用户在TypeError中实现它?这是最好的方法吗(延伸一下就是python-2.7和更新版本中使用的方法?)
发布于 2011-11-04 04:16:54
您的解决方法不是RightWayToDoIt(tm),因为它会丢失信息。无损转换方法如Decimal FAQ中所示的float_to_decimal()配方所示。
我们之所以没有在Python2.6中包含Decimal.from_float,是因为我们对引入二进制浮点数和十进制浮点数之间的无意交互持保守态度。在Python2.7中,这一切都解决了,你可以只编写Decimal(f),其中f是一个二进制浮点数。
除了2.6中的小麻烦之外,我希望您喜欢Decimal模块
发布于 2011-11-04 03:05:03
可能是因为如果您不了解a few implementation details about floats,那么直接转换的行为可能会违反直觉。如the docs中所述
Note
Decimal.from_float(0.1)与Decimal('0.1')不同。由于0.1不能精确地表示为二进制浮点数,因此该值被存储为最接近的可表示值0x1.999999999999ap-4。以十进制表示的等价值是0.1000000000000000055511151231257827021181583404541015625。
如果转换为字符串,则可以控制要使用的精度,因此可以准确地转换为Decimal。
新方法是在Python2.7中引入的--这就是2.6中没有引入的原因。新功能不会向后移植到旧版本。
发布于 2011-11-04 03:08:25
根据2.7的What's New文档(增加了重点)
在大多数平台上,浮点数和字符串之间的
转换现在可以正确地四舍五入。这些转换发生在许多不同的地方:浮点和复数上的str();浮点和复数构造函数;数字格式化;使用marshal、pickle和json模块序列化和反序列化浮点和复数;解析Python代码中的浮点数和虚数;以及小数到浮点数的转换。
因此,尽管他们在2.7之前就可以做到这一点,但显然他们对存在的舍入问题感到不舒服。
https://stackoverflow.com/questions/8000318
复制相似问题