在什么场景下比较浮点数值的相等性是有意义的?
什么时候需要判断两个浮点数是否相等?
哈哈,太懂这种困惑了!我也见过无数人问浮点数怎么比较相等,标准回答清一色都是“别直接比相等,判断是否在某个小误差范围内就行”,但反过来想——到底啥场景真的需要判断浮点数完全相等啊? 我编码这么多年也很少碰到,但确实有几个小众场景可能会用到,给你捋捋:
- 检查计算是否命中理论上的精确值:比如做图形学或物理模拟时,某个计算结果理论上应该刚好是
0.0或者1.0(比如向量归一化后模长是否严格为1,或者碰撞检测中刚好相切的临界状态),这时候写个相等判断会比写极小误差范围更直观,不过其实本质上还是可以用误差范围替代,只是写法上的差异。 - 单元测试的精确验证:比如你写单元测试时,针对某个确定的输入,你明确知道函数的输出应该是一个精确的浮点数(比如某个数学函数的硬编码返回值),这时候判断相等可以直接验证你的实现是否完全符合预期——不过多数时候还是推荐用带误差的断言,避免浮点精度带来的测试用例不稳定。
- 处理无计算损耗的精确浮点数输入:如果你的程序接收的是明确存储为精确浮点数的数据(比如配置文件里写死的
2.71828,或者从其他系统传递过来的、完全没有经过浮点运算的原始值),这时候判断相等是合理的——因为这些值本身没有精度损耗,就是精确的。
不过说实话,绝大多数业务场景里,判断浮点数相等确实没啥必要,甚至可能是个设计坑。如果你的代码里频繁需要做浮点数相等判断,大概率是选错了数据类型——比如金额、数量这种需要精确计算的值,应该用整数或者decimal类型,而不是浮点数。
内容的提问来源于stack exchange,提问作者DarthRubik
相关产品推荐
相关产品推荐

