Parsing JSON floats
#!/usr/bin/env python3
import json
def totalValue(obj):
total = 0
for x in obj:
val = x['val']
print(f'val = {format(val, ".20f")}')
total = total + x['val']
print(f'total: {total}')
jsonTxt = '''
[
{ "id": 1, "val": 0.1 },
{ "id": 2, "val": 0.1 },
{ "id": 3, "val": 0.1 },
{ "id": 4, "val": 0.00000001 }
]
'''
jsonObj = json.loads(jsonTxt)
print(json.dumps(jsonObj, indent=3))
totalValue(jsonObj)
print('-------------------------')
import decimal
class decenc(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, decimal.Decimal):
return format(obj, '.8f')
return super().default(obj)
# decimal.getcontext().prec = 9
jsonObj = json.loads(jsonTxt, parse_float=decimal.Decimal)
print(json.dumps(jsonObj, indent=3, cls=decenc))
totalValue(jsonObj)
The output of the script is
[
{
"id": 1,
"val": 0.1
},
{
"id": 2,
"val": 0.1
},
{
"id": 3,
"val": 0.1
},
{
"id": 4,
"val": 1e-08
}
]
val = 0.10000000000000000555
val = 0.10000000000000000555
val = 0.10000000000000000555
val = 0.00000001000000000000
total: 0.30000001000000004
-------------------------
[
{
"id": 1,
"val": "0.10000000"
},
{
"id": 2,
"val": "0.10000000"
},
{
"id": 3,
"val": "0.10000000"
},
{
"id": 4,
"val": "0.00000001"
}
]
val = 0.10000000000000000000
val = 0.10000000000000000000
val = 0.10000000000000000000
val = 0.00000001000000000000
total: 0.30000001