我依赖于一些使用Decimal类的代码,因为它需要精确到一定数量的小数位.某些函数允许输入为浮点数,因为它与代码库的其他部分接口的方式.要将它们转换为十进制对象,它会使用类似的东西
mydec = decimal.Decimal(str(x))
其中x是作为输入的浮点数.我的问题是,是否有人知道应用于浮点数的’str’方法的标准是什么?
例如,取数字2.1234512.由于表示浮动的方式,它在内部存储为2.12345119999999999.
>>> x = 2.12345119999999999
>>> x
2.1234511999999999
>>> str(x)
'2.1234512'
好的,在这种情况下,str(x)正在执行类似’%.6f’%x的操作.这是我的代码转换为小数的方式的问题.请考虑以下事项:
>>> d = decimal.Decimal('2.12345119999999999')
>>> ds = decimal.Decimal(str(2.12345119999999999))
>>> d - ds
Decimal('-1E-17')
所以,如果我有浮动,2.12345119999999999,我想将它传递给Decimal,使用str()将其转换为字符串会得到错误的答案.我需要知道str(x)的规则是什么,它决定了格式化的内容,因为我需要确定是否需要重写这段代码以避免这个错误(注意它可能没问题,因为,对于例如,一旦我们有一个小数对象,代码可能会舍入到第10个小数位)
在python的文档中必须有一些规则,希望有人可以指点我.谢谢!
最佳答案 在Python源代码中,查看“Include / floatobject.h”.字符串转换的精度在评论后从顶部设置几行,并对选项进行了一些解释:
/* 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转换在这两个文件中的两倍之间的差异.