 <p>The exact value of the float is <code>1.100000000000000088817841970012523233890533447265625</code>. Python isn't somehow keeping track of the original string. When Python stringifies it with <code>str</code>, it truncates to 12 digits.</p> <pre><code>&gt;&gt;&gt; x = 1.0/9 &gt;&gt;&gt; print decimal.Decimal(x) # prints exact value 0.111111111111111104943205418749130330979824066162109375 &gt;&gt;&gt; print x # truncated 0.111111111111 </code></pre> <p>Even with <code>repr</code>, Python uses the shortest string that will round to the original float when parsed with <code>float</code>.</p> <pre><code>&gt;&gt;&gt; print repr(x) 0.1111111111111111 </code></pre> <p>If you want to parse JSON and get Decimal instances instead of float, you can pass a <code>parse_float</code> argument to the <code>load(s)</code> function:</p> <pre><code>&gt;&gt;&gt; json.loads('{"foo": 1.234567890123456789}', parse_float=decimal.Decimal) {u'foo': Decimal('1.234567890123456789')} </code></pre> <p>The above call causes <code>decimal.Decimal</code> to be called to parse numbers in the JSON string, bypassing the rounding that would occur with intermediate <code>float</code> or <code>str</code> calls. You'll get exactly the number specified in the JSON.</p> <p>Note that the API distinguishes between the functions used to parse things that look like floats, things that look like ints, and things that look like <code>Infinity</code>, <code>-Infinity</code>, or <code>NaN</code>. This can be a bit inconvenient if you want all 3 categories to be handled the same way:</p> <pre><code>&gt;&gt;&gt; json.loads('{"foo": 1.234567890123456789}', ... parse_float=decimal.Decimal, ... parse_int=decimal.Decimal, ... parse_constant=decimal.Decimal) {u'foo': Decimal('1.234567890123456789')} </code></pre>