为了了解repr(x)
如何在CPython中为float工作,我检查了^{
buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
'r', 0,
Py_DTSF_ADD_DOT_0,
NULL);
这将使用格式代码'r'
调用^{'g'
,精度设置为17:
precision = 17;
format_code = 'g';
所以我希望repr(x)
和f'{x:.17g}'
返回相同的表示。但事实似乎并非如此:
>>> repr(1.1)
'1.1'
>>> f'{1.1:.17g}'
'1.1000000000000001'
>>>
>>> repr(1.225)
'1.225'
>>> f'{1.225:.17g}'
'1.2250000000000001'
我知道repr
只需要返回尽可能多的数字就可以重建内存中表示的完全相同的对象,因此'1.1'
显然足以返回1.1
,但是我想知道这与(内部使用的).17g
格式选项有什么不同(或者为什么不同)。你知道吗
(Python 3.7.3版)
似乎您正在寻找一种回退方法:
制约回退方法的预处理器变量是
PY_NO_SHORT_FLOAT_REPR
。如果设置了dtoa
,则不会将it will fail编译为:这可能不是大多数现代设备的情况。这个问答解释了Python何时/为什么选择这两种方法:What causes Python's float_repr_style to use legacy?
现在在line 947有了可用的版本
在那里你可以看到
g
和r
有细微的差别(在注释中解释)似乎和你描述的行为相符。注意,
"{:.16g}".format(1.225)
产生1.225
相关问题 更多 >
编程相关推荐