- 使用
decimal
模块:
decimal
模块提供了一种十进制浮点运算,能够精确表示小数,避免了浮点数的精度问题。在序列化时,先将浮点数转换为decimal.Decimal
对象,然后在反序列化时再转换回浮点数。
- 代码示例:
import json
from decimal import Decimal
# 模拟一个浮点数
num = 0.1 + 0.2
decimal_num = Decimal(str(num))
# 序列化
serialized_data = json.dumps({'num': decimal_num}, default=str)
# 反序列化
deserialized_data = json.loads(serialized_data)
restored_num = float(deserialized_data['num'])
print(f"原始浮点数: {num}")
print(f"转换为Decimal后的数: {decimal_num}")
print(f"序列化后的数据: {serialized_data}")
print(f"反序列化并转换回浮点数: {restored_num}")
- 原理:
- 在上述代码中,首先将浮点数
num
(这里num
是0.1 + 0.2
的结果,在普通浮点数运算中存在精度问题)转换为Decimal
对象decimal_num
。由于Decimal
构造函数要求传入字符串形式的数字,所以使用str
将浮点数转换为字符串再传入。
- 在序列化时,通过
json.dumps
的default
参数指定将Decimal
对象转换为字符串进行序列化。
- 反序列化时,先从JSON字符串中加载数据,然后将从JSON中获取的字符串形式的数字转换回浮点数,这样在一定程度上保持了高精度。