设变量 $x$ 为 float 型且已赋值,则以下语句中能将 $x$ 中的数值保留到小数点后两位,并将第三位四舍五入的是()
核心就三步:乘100放大、加0.5凑整、取整截断,最后再除100还原。关键是(int)必须夹在加0.5之后、除100之前。
最容易栽跟头的是漏掉(int)强制转换,以为浮点运算会自动进位,其实C++里浮点除法永远保留小数,A选项就是典型陷阱;其次是括号位置搞错,把(int)挪到除100后面,那小数部分就被除丢了;还有人会误以为0.5/100.0也能凑整,殊不知除法的优先级让0.5先被100除成了0.005,完全起不到四舍五入作用,D选项就是坑在这儿。
C++ 算术运算与类型转换
四舍五入保留N位小数的标准方法: 1. 将原数乘以 10^N(放大N位小数到整数部分) 2. 加 0.5(实现四舍五入的"入") 3. 取整(截断小数) 4. 除以 10^N(恢复刻度)
原理:加0.5后取整,相当于"如果小数部分≥0.5,进位"。
设 x = 3.14159(保留两位小数 → 3.14) 1. x × 100 = 314.159 2. +0.5 = 314.659 3. (int)314.659 = 314(截断) 4. /100.0 = 3.14
设 x = 3.14559(保留两位小数 → 3.15) 1. x × 100 = 314.559 2. +0.5 = 315.059 3. (int)315.059 = 315(截断 → 进位成功!) 4. /100.0 = 3.15
选项分析:
x = (x*100+0.5)/100.0; 缺少 (int) 强制转换,结果仍然是浮点数,无法实现截断 ❌x = (int)(x*100+0.5)/100.0; 先乘100加0.5,再强制取整,再除100恢复 ✅x = (x/100+0.5)*100.0; 先除以100,运算顺序完全错误 ❌x = x*100+0.5/100.0; 缺少取整,且 0.5/100 = 0.005,达不到四舍五入效果 ❌100.0(浮点数),否则整数除法会丢失小数部分(int)(x * 10^N + 0.5) / 10^Nprintf("%.2f", x) 或 std::fixed << std::setprecision(2) 实现相同效果