MST
星途 面试题库

面试题:Python浮点数精度序列化存储:常见问题及处理

在Python中处理浮点数精度问题时,经常会遇到数据序列化存储后精度丢失的情况。请描述一种在序列化浮点数(如使用JSON进行序列化存储)时保持相对高精度的方法,并给出代码示例。
17.3万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
  1. 使用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}")
  1. 原理
    • 在上述代码中,首先将浮点数num(这里num0.1 + 0.2的结果,在普通浮点数运算中存在精度问题)转换为Decimal对象decimal_num。由于Decimal构造函数要求传入字符串形式的数字,所以使用str将浮点数转换为字符串再传入。
    • 在序列化时,通过json.dumpsdefault参数指定将Decimal对象转换为字符串进行序列化。
    • 反序列化时,先从JSON字符串中加载数据,然后将从JSON中获取的字符串形式的数字转换回浮点数,这样在一定程度上保持了高精度。