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
相关产品推荐
相关产品推荐

