tags:

views:

195

answers:

2

Hi,

I have a string with a floating point number in it, but I can't get JSON to load it as a decimal.

x = u'{"14": [4.5899999999999999, "susan"]}'
json.loads(x, parse_float = decimal.Decimal)

This returns:

{u'14': [Decimal('4.5899999999999999'), u'susan']}

Any idea how I can make it into the actual "4.59"?

+5  A: 

You need to define a function that performs whatever rounding you desire, then uses the altered string to build the Decimal. Your current solution does work perfectly well: it just does exactly what you tell it to, i.e., use the entire string, as opposed to what you desire (and have not told either the code, or us;-).

E.g.:

>>> def doit(s): return decimal.Decimal(str(round(float(s), 2)))
... 
>>> json.loads(x, parse_float=doit)
{u'14': [Decimal('4.59'), u'susan']}
>>>
Alex Martelli
+1  A: 

You can't. That number isn't 4.59, it's 4.589999999999999999, as far as the json parser knows. You'd need to add some more complicated logic that rounds numbers like that, as a wrapper around decimal.Decimal.

inklesspen