一次数据比对需求规定:小数点后不足五位补齐,超过五位截断,然后比较共有点位的全部数据。

表面上,这是格式处理。

1.2      -> 1.20000
1.234567 -> 1.23456

但继续追问就会出现一串业务问题:

  • 为什么是五位?
  • 是截断还是四舍五入?
  • 字符串 "1.20000" 与数值 1.2 是否相同?
  • 空值、非法值和真实的零怎样区分?
  • 采集时间相差多少仍算同一条数据?

这些问题不能由 float64 替业务回答。

我的处理原则是先把比较契约写出来,再选择数据类型和算法。若五位小数是业务精度,可以把值转成定点整数;若原始文本本身有审计意义,就同时保留原文与标准化结果;若要求“截断”,代码中就不能偷偷使用默认舍入。

测试也不该只有一个正常样例。边界值更重要:

-0.000009
0
0.999999
NULL
""
"not-a-number"

数据质量问题常常以“显示不一致”出现,最后却落到系统对现实的定义不一致。

精度从来不只是保留几位小数。它是一份契约:我们准备忽略多大的差异,又愿意为多大的差异负责。