一次数据比对需求规定:小数点后不足五位补齐,超过五位截断,然后比较共有点位的全部数据。
表面上,这是格式处理。
1.2 -> 1.20000
1.234567 -> 1.23456
但继续追问就会出现一串业务问题:
- 为什么是五位?
- 是截断还是四舍五入?
- 字符串
"1.20000"与数值1.2是否相同? - 空值、非法值和真实的零怎样区分?
- 采集时间相差多少仍算同一条数据?
这些问题不能由 float64 替业务回答。
我的处理原则是先把比较契约写出来,再选择数据类型和算法。若五位小数是业务精度,可以把值转成定点整数;若原始文本本身有审计意义,就同时保留原文与标准化结果;若要求“截断”,代码中就不能偷偷使用默认舍入。
测试也不该只有一个正常样例。边界值更重要:
-0.000009
0
0.999999
NULL
""
"not-a-number"
数据质量问题常常以“显示不一致”出现,最后却落到系统对现实的定义不一致。
精度从来不只是保留几位小数。它是一份契约:我们准备忽略多大的差异,又愿意为多大的差异负责。