C语言类型转换疑问:为何强制转换clouds为double才得正确结果?
为什么添加(double)强制类型转换后C语言代码的计算结果才正确?
问题代码
#include <stdio.h> #include <math.h> void main(void) { int clouds=15; double Zenith_rad=1.1827, Normal_direct=774.6839, A=0, B=0, C=0; A = Normal_direct * cos(Zenith_rad); B = A * ( 1 - ( clouds / 100)) ; C = A * ( 1 - ( 0.15)) ; printf("A: %f\n" ,A); printf("B: %f\n" ,B); printf("C: %f\n" ,C); }
结果对比
- 预期输出:
A: 293.161306 B: 249.187110 C: 249.187110 - 实际输出:
A: 293.161306 B: 293.161306 C: 249.187110
原因解析
问题出在C语言的整数除法规则上:当两个整数进行除法运算时,结果会自动舍弃小数部分,只保留整数商。
你的代码里,clouds是int类型的15,100也是整数常量,所以clouds / 100执行的是整数除法:15 / 100 = 0(小数部分0.15被直接丢弃)。代入B的计算式后:
B = A * (1 - 0) = A * 1 = A
这就是为什么B的结果和A完全相同。
而给clouds添加(double)强制类型转换后,clouds被转换成double类型的15.0,此时100会被C语言隐式转换为double类型的100.0,除法运算变成浮点数除法:15.0 / 100.0 = 0.15。代入计算后:
B = A * (1 - 0.15) = A * 0.85
这个结果就和C的计算逻辑一致,最终得到正确的249.187110。
你也可以通过把100写成100.0来避免强制转换,让除法自动变成浮点数运算,效果完全相同。
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

