
int 除法结果总是向下取整,怎么拿到小数?
直接用 int 除 int,结果必然是 int,小数部分被无声截断——这不是 bug,是 C++ 标准行为。想保留小数,必须让至少一个操作数变成浮点类型,触发浮点除法。
- 最简做法:
(double)a / b或a / (double)b,强制提升类型 - 别写
(double)(a / b):先做整除再转 double,小数早没了 - 如果 a、b 是表达式(比如
vec.size()),括号要包准,避免隐式转换失效 - 注意
float精度低,double更稳妥;除非明确要求单精度
除零时程序崩溃,怎么提前防住?
int 除以 0 会触发 SIGFPE(Unix/Linux)或异常(Windows),不是返回 NaN 或 Inf——浮点除零才可能产生这些值,整数除零是未定义行为,多数情况直接终止进程。
- 必须在除法前检查:
if (b != 0) { result = (double)a / b; } - 别依赖
try/catch捕获:C++ 标准不保证整数除零抛异常,g++/clang 默认不抛,MSVC 也未必 - 如果是模板函数或泛型计算,考虑用
std::div做安全整除(但只返回商余数,不解决小数需求)
用 std::round 或 std::floor 控制小数位?
这些函数作用对象是浮点数,不是整数除法本身。它们只能对已经算出的浮点结果做二次处理,不能改变除法运算类型。
- 错误示范:
std::round(a / b)—— 还是先整除,再 round 一个整数 - 正确顺序:
std::round((double)a / b * 100.0) / 100.0(保留两位小数) - 注意
std::round返回double,若需输出或存为float,得显式转换 - 性能上无明显开销,但频繁调用仍建议复用中间浮点结果,避免重复转换
跨平台编译时,int 除法行为一致吗?
一致。C++ 标准规定:向零取整(truncated toward zero),即 7 / -3 == -2,-7 / 3 == -2。这点和 Python 的向下取整(floor division)不同,容易混淆。
立即学习“C++免费学习笔记(深入)”;
- 如果你需要 Python 风格的 floor 除法,得自己写:
a / b - ((a % b != 0) && ((a - 更稳妥是转成
double后用std::floor,但要注意负数浮点精度误差(如-7.0 / 3.0可能略大于 -2.333...) - 嵌入式或老编译器(如某些 ARM gcc 4.x)对负数取模实现有偏差,务必实测
a % b符号
实际写的时候,最常漏掉的是除零检查和类型提升顺序——这两个点一旦出错,调试起来不像逻辑错,而像“程序莫名其妙挂了”或者“结果永远是 0”。









