整数运算后preTopping输出始终为0.0000的技术求助
整数除法导致浮点变量输出0.0000的问题解决
问题重现
尝试打印preTopping变量时,结果始终显示为0.0000,即便提前添加(float)类型转换也无法解决。相关代码如下:
int length, width; printf("Please enter your pizza's length (cm): "); scanf(" %d", &length); printf("Please enter your pizzas width (cm): "); scanf(" %d", &width); float preTopping, postTopping=0; preTopping = ((length * width) / (40 * 40)) * 60; printf("%f", preTopping);
问题表现为整数除法或乘法运算后结果始终为0.0000。
问题原因
这是C语言整数除法的特性导致的:当两个整数进行除法运算时,程序会自动舍弃小数部分取整。如果输入的length * width结果小于40*40(即1600),那么(length * width)/(40*40)的整数运算结果直接为0,后续乘以60依然是0,最终赋值给float变量后就显示为0.0000。
哪怕单独给某个整数加(float)转换,若转换时机错误(比如先完成整数除法再转换),也无法改变结果。例如(float)((length*width)/(40*40))*60,括号内的整数除法已经得到0,转换后还是0.0,结果依然不对。
解决方案
方案1:将除数改为浮点类型
把运算中的整数除数替换为浮点值,触发整个表达式的浮点运算:
preTopping = ((length * width) / 1600.0f) * 60;
1600.0f是float类型,除法运算会保留小数部分,最终结果正确。
方案2:提前转换变量类型
在乘法阶段就将其中一个整数转换为float,确保后续运算为浮点类型:
preTopping = ((float)length * width / (40 * 40)) * 60;
(float)length将整数转换为float,length*width会自动以浮点方式计算,避免整数取整问题。
方案3:统一转换为浮点变量
先将所有参与运算的整数变量转换为float类型,所有运算基于浮点进行:
float f_length = length, f_width = width; preTopping = ((f_length * f_width) / (40.0f * 40.0f)) * 60.0f;
这种方式更直观,彻底规避整数运算的限制。
内容的提问来源于stack exchange,提问作者idan yossifov
相关产品推荐
相关产品推荐

