如何修复Beecrowd平台上百分比计算的小数点后数值错误
C语言百分比计算小数精度错误问题解决
问题描述
将以下C语言代码提交至Beecrowd平台后,生成的小数点后数值出现错误。期望得到如「Percentual de coelhos: 32.62 %」这类保留两位小数的百分比结果,已尝试将float改为double,但问题仍未解决。
原代码
#include <stdio.h> double pct_cobaias(int x, int y); int main() { int contador, cobaia; char tipo; int soma_cobaia, soma_coelho, soma_rato, soma_sapo; double pct_coelho, pct_rato, pct_sapo; scanf("%d", &contador); soma_cobaia = 0; soma_coelho = 0; soma_rato = 0; soma_sapo = 0; while (contador > 0) { scanf("%d %c", &cobaia, &tipo); if (cobaia >= 1 && cobaia <= 15) { if (tipo == 'C' || tipo == 'R' || tipo == 'S') { soma_cobaia += cobaia; if (tipo == 'C') { soma_coelho += cobaia; } if (tipo == 'R') { soma_rato += cobaia; } if (tipo == 'S') { soma_sapo += cobaia; } } } contador--; } pct_coelho = pct_cobaias(soma_coelho, soma_cobaia); pct_rato = pct_cobaias(soma_rato, soma_cobaia); pct_sapo = pct_cobaias(soma_sapo, soma_cobaia); printf("Total: %d cobaias\n", soma_cobaia); printf("Total de coelhos: %d\n", soma_coelho); printf("Total de ratos: %d\n", soma_rato); printf("Total de sapos: %d\n", soma_sapo); printf("Percental de coelhos: %.2lf %\n", pct_coelho); printf("Percental de ratos: %.2lf %\n", pct_rato); printf("Percental de sapos: %.2lf %\n", pct_sapo); return 0; } double pct_cobaias(int x, int y) { double pct; pct = (x * 100) / y; return pct; }
错误原因分析
- 整数除法丢失精度:
pct_cobaias函数中,x和y都是int类型,x*100的结果也是int,执行/y时会触发整数除法——直接截断小数部分,再转成double类型,导致小数精度完全丢失。比如3262/100会得到32,而非32.62。 - printf格式符错误:输出百分比符号时,直接写
%会被解析为格式控制符的开头,无法正确输出单个%,会导致输出格式混乱。
修正方案
修改点1:将整数除法改为浮点除法
把计算式中的任意一个操作数转为double类型,强制触发浮点运算:
pct = (double)x * 100 / y;
或者:
pct = (x * 100.0) / y;
修改点2:修正printf的百分比符号输出
将输出语句中的%改为%%,才能正确输出单个百分比符号:
printf("Percental de coelhos: %.2lf %%", pct_coelho);
修正后的完整代码
#include <stdio.h> double pct_cobaias(int x, int y); int main() { int contador, cobaia; char tipo; int soma_cobaia, soma_coelho, soma_rato, soma_sapo; double pct_coelho, pct_rato, pct_sapo; scanf("%d", &contador); soma_cobaia = 0; soma_coelho = 0; soma_rato = 0; soma_sapo = 0; while (contador > 0) { scanf("%d %c", &cobaia, &tipo); if (cobaia >= 1 && cobaia <= 15) { if (tipo == 'C' || tipo == 'R' || tipo == 'S') { soma_cobaia += cobaia; if (tipo == 'C') { soma_coelho += cobaia; } if (tipo == 'R') { soma_rato += cobaia; } if (tipo == 'S') { soma_sapo += cobaia; } } } contador--; } pct_coelho = pct_cobaias(soma_coelho, soma_cobaia); pct_rato = pct_cobaias(soma_rato, soma_cobaia); pct_sapo = pct_cobaias(soma_sapo, soma_cobaia); printf("Total: %d cobaias\n", soma_cobaia); printf("Total de coelhos: %d\n", soma_coelho); printf("Total de ratos: %d\n", soma_rato); printf("Total de sapos: %d\n", soma_sapo); printf("Percental de coelhos: %.2lf %%\n", pct_coelho); printf("Percental de ratos: %.2lf %%\n", pct_rato); printf("Percental de sapos: %.2lf %%\n", pct_sapo); return 0; } double pct_cobaias(int x, int y) { double pct; pct = (double)x * 100 / y; return pct; }
内容的提问来源于stack exchange,提问作者Henrique Bispo
相关产品推荐
相关产品推荐

