Java浮点数基于IEEE 754标准,使用二进制表示实数。其核心矛盾在于:多数十进制小数无法精确转为二进制(如0.1)。这导致:
- 精度丢失:
0.1f + 0.2f == 0.3f返回false(实际值约为0.30000000000000004) - 累积误差:循环累加浮点数引发误差放大
- 比较失效:直接使用
==比较浮点数结果不可靠 - 特殊值问题:NaN(非数)、无穷大需特殊处理
应对策略:
- 金融计算:换用
BigDecimal(构造时务必用字符串!) - 科学计算:明确误差范围,使用
Math.abs(a-b) < EPSILON比较 - 整型替代:货币单位用分(整型)存储
- 库函数辅助:
StrictMath确保跨平台一致性
浮点数的本质是精度与效率的权衡。理解其二进制表示机制(符号位、指数域、尾数域)是避开陷阱的关键。在需要绝对精确的场景,务必放弃float/double;在高性能计算中,则需通过误差控制与算法优化驾驭浮点之力。

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



