You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么使用static_cast做类型转换时,数值会出现不符合预期的变化?

问题根因
  1. 浮点数二进制存储精度限制

十进制的273.15无法被double类型的二进制浮点数精确表示,你在代码中书写的字面量273.15,实际被编译器存储为略小于273.15的近似值,典型值为273.1499999999999772626324556767940521240234375。

  1. 乘法运算后的精度偏差
    上述近似值乘以100后,得到的结果是27314.99999999999636202119290828708648681640625,而非你预期的整数27315。
  2. 整数转换的截断规则
    C++中static_cast<int>对浮点数做类型转换时,会直接舍弃小数部分,不执行四舍五入,因此上述接近27315的浮点数会被转换为整数27314。
  3. 最终计算结果
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 05:18:02