擅长:python、mysql、java
<p>关于<code>repr</code>的关键要求是它应该往返;也就是说,<code>eval(repr(f)) == f</code>在所有情况下都应该给出{<cd3>}。在</p>
<p>在python2.x(2.7之前的版本)中,<code>repr</code>的工作方式是使用<code>%.17g</code>格式执行<code>printf</code>,并丢弃尾随的零。IEEE-754保证这是正确的(对于64位浮点)。从2.7和3.1开始,Python使用了一种更智能的算法,在某些情况下,<code>%.17g</code>给出了不必要的非零终端数字或终端9,这种算法可以找到更短的表示。请参见<a href="http://docs.python.org/dev/whatsnew/3.1.html#other-language-changes">What's new in 3.1?</a>和<a href="http://bugs.python.org/issue1580">issue 1580</a>。在</p>
<p>即使在Python2.7中,<code>repr(0.1 * 0.1)</code>也给出了<code>"0.010000000000000002"</code>。这是因为根据IEEE-754解析和算术,<code>0.1 * 0.1 == 0.01</code>是<code>False</code>;也就是说,与<code>0.1</code>最近的64位浮点值相乘时,将生成一个64位浮点值,该值不是最接近<code>0.01</code>的64位浮点值:</p>
<pre><code>>>> 0.1.hex()
'0x1.999999999999ap-4'
>>> (0.1 * 0.1).hex()
'0x1.47ae147ae147cp-7'
>>> 0.01.hex()
'0x1.47ae147ae147bp-7'
^ 1 ulp difference
</code></pre>
<p><code>repr</code>和{<cd15>}(2.7/3.1之前的版本)的区别在于{<cd15>}格式有12位小数,而不是17位,这是不可舍入的,但在许多情况下会产生更具可读性的结果。在</p>