要回答第一个问题,请查看 Python 源代码中的以下(稍微精简的)代码:
#define PREC_REPR 17
#define PREC_STR 12
void PyFloat_AsString(char *buf, PyFloatObject *v) {
format_float(buf, 100, v, PREC_STR);
}
void PyFloat_AsReprString(char *buf, PyFloatObject *v) {
format_float(buf, 100, v, PREC_REPR);
}
所以基本上,repr(float)
将返回一个以 17 位精度格式化的字符串,并且str(float)
将返回一个具有 12 位精度的字符串。正如您可能已经猜到的那样,print
uses str()
并在解释器中输入变量名称使用repr()
。由于只有 12 位精度,看起来您得到了“正确”答案,但这只是因为您期望的值和实际值在 12 位以内是相同的。
这是差异的一个简单示例:
>>> str(.1234567890123)
'0.123456789012'
>>> repr(.1234567890123)
'0.12345678901230001'
至于你的第二个问题,我建议你阅读Python教程的以下部分:浮点运算:问题和限制 http://docs.python.org/tutorial/floatingpoint.html#floating-point-arithmetic-issues-and-limitations
当您以基数 2 存储基数 10 小数时,与任何其他表示形式相比,它归结为效率、更少的内存和更快的浮点运算,但您确实需要处理不精确性。
正如 JBernardo 在评论中指出的那样,这种行为在 Python 2.7 及更高版本中是不同的,上面教程链接中的以下引用描述了差异(使用0.1
举个例子):
在 Python 2.7 和 Python 3.1 之前的版本中,Python 对此进行了舍入
值保留 17 位有效数字,即“0.10000000000000001”。在
当前版本,Python 显示基于最短值的值
正确舍入为真实二进制值的小数部分,
结果只是“0.1”。