整数除法陷阱
约 10 分钟
两个整数相除,结果还是整数,小数部分被直接砍掉(向零取整),不是四舍五入。5/2 得 2 不是 2.5。读程序题特别爱在这里埋坑。
cout << 5 / 2 << "\n"; // 2,小数被砍掉
cout << 5 / 2 * 2 << "\n"; // 从左到右:5/2=2,2*2=4(不是 5!)
cout << 5.0 / 2 << "\n"; // 2.5,有一个浮点数就不截断
看 5/2*2:乘除同级、从左到右,先算 5/2=2(砍掉 0.5),再 2*2=4——不是 5。很多人想当然写 5。
避坑要点:一是想得到小数,至少让一个操作数是浮点,比如 5.0/2 得 2.5,或写 (double)a/b;二是负数向零取整,-5/2 得 而非 ;三是先乘后除能减少精度损失,a*b/c 通常比 a/c*b 更准(但要防乘法溢出)。凡是表达式里出现整数除法,做题时先停一下,确认它是不是被截断了。
小纸条
5/2*2 等于几?
登录 后可看答案