Python default behavior of str(x)
我依赖于一些使用decimal类的代码,因为它需要精确到一定数量的小数位。有些函数允许输入是浮动的,因为它与代码基的其他部分的接口方式。要将它们转换为十进制对象,它使用
1 | mydec = decimal.Decimal(str(x)) |
其中x是作为输入的浮点。我的问题是,是否有人知道"str"方法应用于float的标准是什么?
例如,取数字2.1234512。它在内部存储为2.1234511999999999,因为浮点数是如何表示的。
1 2 3 4 5 | >>> x = 2.12345119999999999 >>> x 2.1234511999999999 >>> str(x) '2.1234512' |
好的,在这种情况下,str(x)执行的操作类似于"%.6f""%x"。这是我的代码转换为小数的方式的问题。采取以下措施:
1 2 3 4 | >>> d = decimal.Decimal('2.12345119999999999') >>> ds = decimal.Decimal(str(2.12345119999999999)) >>> d - ds Decimal('-1E-17') |
所以,如果我有float,2.1234511999999999,我想把它传递给decimal,用str()把它转换成一个字符串,会得到错误的答案。我需要知道str(x)的规则是什么,这些规则决定了格式是什么,因为我需要确定是否需要重新编写此代码以避免此错误(请注意,这可能是正常的,因为例如,一旦我们有了十进制对象,代码可能会四舍五入到小数点后10位)。
在python的文档中一定有一些规则,希望这里的某个人能指向我。谢谢!
在python源中,查找"include/floatobject.h"。字符串转换的精度是在注释后从顶部开始设置几行,并对选择进行一些解释:
1 2 3 4 5 | /* The str() precision PyFloat_STR_PRECISION is chosen so that in most cases, the rounding noise created by various operations is suppressed, while giving plenty of precision for practical use. */ #define PyFloat_STR_PRECISION 12 |
如果你需要不同的东西,你可以选择重建。任何更改都将更改浮点数和复数的格式。请参见./objects/complexobject.c和./objects/floatobject.c。此外,您还可以比较这两个文件中repr和str转换双精度的不同。
这里有几个问题值得讨论,但总结是:您不能提取尚未存储在系统中的信息。
如果您取了一个十进制数并将其存储为一个浮点,那么您将丢失信息,因为大多数具有有限位数的十进制(以10为基数)数不能使用以2为基数(二进制)的有限位数存储。
如前所述,
return a string containing a nicely printable representation of an object
对于
如果没有原始字符串,则无法从
您还可以使用