贝利信息

C++浮点数精度问题解析_C++小数运算误差说明

日期:2026-01-04 00:00 / 作者:舞夢輝影
浮点数在C++中用二进制近似表示十进制小数,存在固有误差;0.1和0.2在二进制中为无限循环小数,无法精确存储,导致0.1+0.2≠0.3;应使用误差范围abs(a-b)

浮点数在C++中不是精确表示小数的工具,而是用二进制近似存储十进制小数,因此几乎所有小数运算都存在固有误差。这不是bug,而是IEEE 754标准下的正常现象。

为什么0.1 + 0.2 != 0.3?

十进制小数0.1在二进制中是无限循环小数(类似十进制里的1/3 = 0.333…),无法用有限位数精确表示。float通常只有约7位有效数字,double约15–17位,超出部分被截断或舍入,导致计算结果偏差。

如何安全地比较浮点数?

不用==直接比较,改用“是否落在某个误差范围内”:

哪些操作会放大误差?

误差会在多次运算中累积或放大:

什么情况下该换方案?

如果业务要求精确小数行为(如金融计算、配置解析、测试断言),别硬扛浮点误差:

基本上就这些。理解浮点数是“近似容器”而非“小数计算器”,很多奇怪结果就变得合理了。