为什么使用static_cast做类型转换时,数值会出现不符合预期的变化?
问题根因
- 浮点数二进制存储精度限制
十进制的
273.15无法被double类型的二进制浮点数精确表示,你在代码中书写的字面量273.15,实际被编译器存储为略小于273.15的近似值,典型值为273.1499999999999772626324556767940521240234375。
- 乘法运算后的精度偏差
上述近似值乘以100后,得到的结果是27314.99999999999636202119290828708648681640625,而非你预期的整数27315。 - 整数转换的截断规则
C++中static_cast<int>对浮点数做类型转换时,会直接舍弃小数部分,不执行四舍五入,因此上述接近27315的浮点数会被转换为整数27314。 - 最终计算结果
27314转回double后除以100,得到的结果就是精确的273.14,因此和273.14做相等判断时返回真,输出1。
修正方案
- 对精度要求高的场景,优先用整数存储放大后的小数,比如直接用
int存储乘以100后的温度值,全程做整数运算,从根源避免浮点数精度误差 - 若必须使用浮点数转整数的逻辑,可以在转换前加一个极小的偏移量抵消精度误差,示例代码如下:
static_cast<int>(273.15 * 100 + 1e-6) - 禁止直接用
==判断两个浮点数相等,改为判断差值绝对值是否小于可接受的误差阈值,示例代码如下:std::cout << (fabs(i - 273.15) < 1e-6);
内容的提问来源于stack exchange,提问作者roditu
相关产品推荐
相关产品推荐

