答案是整数除法导致结果为0.0,因1/2先按int运算得0,再转double;需至少一个操作数为浮点数或强制转换才能得到正确浮点结果。

直接把 1/2 这样的整数表达式赋给 double 变量,结果是 0.0,不是精度问题,而是整数除法在先——这个“归零”根本没经过浮点运算,是编译器按规则截断的确定行为。
看清运算发生在哪个类型上
关键不在变量声明类型,而在参与运算的字面量或变量本身是不是整数。只要两个操作数都是 int(比如 1 和 2),除法就按整数除法执行,结果必为整数,小数部分直接丢弃。
-
double x = 1 / 2;→ 先算1/2 == 0(int结果),再把0赋给double→x == 0.0 -
double x = 1.0 / 2;或double x = 1 / 2.0;→ 至少一个操作数是浮点数,触发浮点除法 →x == 0.5 -
int a = 1, b = 2; double x = a / b;同样是整数除法 →x == 0.0
快速定位:用打印或调试看中间值
别只信最终输出,要验证每一步的实际值。尤其关注带除法的子表达式:
- 加一句
printf("1/2 = %d\n", 1/2);,会输出0,立刻暴露问题 - 在 IDE 中设断点,鼠标悬停看
a / b的计算结果,不是看double变量最后是多少 - 如果用了宏或常量(如
#define N 100),检查它是否被当作整数参与了除法
可靠修复:让至少一个操作数带小数点或强制转换
不需要改整个公式逻辑,只需“撬动”除法运算的类型起点:
- 写成
1.0 / i、1.0 / 2、static_cast<double>(1) / 2</double>(C++)或(double)1 / 2(C/Java) - 对变量做转换更稳妥:
double x = (double)a / b;,比a / (double)b更易读且等效 - 循环中常用写法:
sum += 1.0 / i;,而不是sum += 1 / i;
避免靠猜:统一用浮点字面量初始化计数器
像交错级数 1 - 1/2 + 1/3 - ... 这类问题,初始值和步进都建议从浮点开始:
- 错:
double sum = 1; for(int i = 2; i - 对:
double sum = 1.0; for(int i = 2; i - 更清晰:
sum += (i % 2 == 0 ? -1.0 : 1.0) / (double)i;










