首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python-2.6中从浮点型到十进制的转换:如何实现以及为什么没有实现

python-2.6中从浮点型到十进制的转换:如何实现以及为什么没有实现
EN

Stack Overflow用户
提问于 2011-11-04 02:51:09
回答 3查看 8.9K关注 0票数 14

从浮点型到小数型的直接转换是在python-2.7中实现的,在Decimal的构造函数和Decimal.from_float()类方法中都是如此。

相反,Python-2.6抛出了一个TypeError,建议首先转换为字符串:

代码语言:javascript
复制
TypeError: Cannot convert float to Decimal.  First convert the float to a string

因此,我通常的解决方法是:

代码语言:javascript
复制
if sys.version_info < (2, 7):
    Decimal.from_float = classmethod(lambda cls, x: cls(str(x)))

这只是错误消息的文字翻译-我也不会费心在构造函数中实现它。

如果这么简单,为什么他们不首先实现它,而是告诉用户在TypeError中实现它?这是最好的方法吗(延伸一下就是python-2.7和更新版本中使用的方法?)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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模块

票数 11
EN

Stack Overflow用户

发布于 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中没有引入的原因。新功能不会向后移植到旧版本。

票数 4
EN

Stack Overflow用户

发布于 2011-11-04 03:08:25

根据2.7的What's New文档(增加了重点)

在大多数平台上,浮点数和字符串之间的

转换现在可以正确地四舍五入。这些转换发生在许多不同的地方:浮点和复数上的str();浮点和复数构造函数;数字格式化;使用marshal、pickle和json模块序列化和反序列化浮点和复数;解析Python代码中的浮点数和虚数;以及小数到浮点数的转换

因此,尽管他们在2.7之前就可以做到这一点,但显然他们对存在的舍入问题感到不舒服。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8000318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档