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

C语言double转int异常行为原因及安全整数除法实现方法

问题原因解析
  • 第四行输出0的核心原因是C语言的整数除法规则
    C语言中,当除法运算符/两侧的操作数都为整数类型时,会执行向零截断的整数除法,仅保留整数部分。你代码中的10和100都是int类型字面量,因此10/100的计算结果直接为int类型的0,后续计算1000 * 0结果还是0,强制转换为int后仍然是0,所以第四行输出0。
    即使编译器在编译期计算该表达式,也会严格遵循C语言的运算规则,不会自动将整数除法转为浮点除法,因此不可能得到和第三行一致的结果。
  • 第三行输出100的逻辑
    第三行中的0.1是double类型字面量,计算1000 * 0.1时,int类型的1000会先隐式转换为double类型,执行浮点乘法得到近似值100.0,强制转换为int后就得到100,因此输出符合预期。
安全整数除法的正确实现方式

允许使用浮点运算的场景

如果能接受浮点运算的微小精度误差,只需要保证除法的操作数至少有一个是浮点类型即可触发浮点除法:

// 写法1:使用浮点字面量
printf("%d\n", (int)(1000 * (10.0 / 100)));
// 写法2:手动强制转换其中一个操作数为浮点类型
printf("%d\n", (int)(1000 * ((double)10 / 100)));

以上两种写法都会输出100。

追求高精度/避免浮点开销的场景

优先使用先乘后除的整数运算逻辑,既不会有浮点精度损失,也没有浮点运算的性能开销,只要保证乘法步骤不会超出当前整数类型的取值范围即可:

// 先算乘法再算除法,全程为整数运算
printf("%d\n", 1000 * 10 / 100); // 输出100

内容的提问来源于stack exchange,提问作者kiler129

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 08:27:02