JSON文本中的小数默认会被Python解析为float。如果后续要求保留十进制数值语义,应考虑在loads时通过parse_float使用Decimal,而不是等二进制浮点近似已经产生后再补救。

先比较两条数据路径
第一条路径先得到float再传入Decimal,保留的会是那个浮点数的实际值;第二条在解析数字文本时直接创建Decimal。下面使用0.1做固定输入,本地断言能显示两者不同。
import json
from decimal import Decimal
raw = '{"ratio":0.1,"count":2,"label":"0.1"}'
normal = json.loads(raw)
precise = json.loads(raw, parse_float=Decimal)
assert isinstance(normal["ratio"], float)
assert precise["ratio"] == Decimal("0.1")
assert Decimal(normal["ratio"]) != Decimal("0.1")
assert type(precise["count"]) is int
assert precise["label"] == "0.1"
print(precise["ratio"], type(precise["count"]).__name__)
parse_float不会把所有字段都变成Decimal
本例count仍为int,带引号的label仍为字符串。该回调处理的是JSON中被识别为浮点数字的文本;不要由一个选项推断全对象都采用了同一种数值类型。类型转换需要与字段含义对应。
保留十进制值不等于规定了舍入规则
Decimal运算仍受上下文精度及舍入方式影响。先确定数据的单位、允许精度和何时舍入,再进行计算。若源头本来给出的就是近似值,换成Decimal也不会恢复从未传来的真实数据。
输出时再确认协议要求
标准json.dumps默认不直接支持Decimal。把它转成字符串会改变JSON类型,转回float则可能重新引入近似;应按接口契约选择处理方案,不能为了避免报错随意转换。这个练习只验证输入解析阶段,没有修改真实财务数据或给出金额计算规则。
资料来源与继续学习
资料查阅日期:2026年10月15日。示例、阅读练习与操作建议由本站整理。
资料查阅与编辑日期:2026年10月15日。作者:玖柒。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END






