You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 04:25:00