在做牛客题霸的一道基础语法题时,遇到了浮点数四舍五入的问题。
对于输入的21.195,%.2f理应输出21.20,结果输出为21.19。显然,发生了四舍五入的错误。
为此,我查询了此题的讨论区。
浮忆夏说:“浮点数存储有不准确性,所以有概率出现四舍五入不对的情况,这个时候要用round(变量 * 100) / 100 来让浮点数变得具有准确性”
我还不是很理解,为了解决这个问题,我咨询了豆包ai。
答:“由于浮点数在计算机中是以二进制形式存储的,对于一些十进制小数,无法精确表示,这可能会导致在进行四舍五入等操作时出现不符合预期的结果。使用 round(变量 * 100) / 100
这种方式可以将浮点数精确到小数点后两位,避免部分精度丢失问题。“
解决方法:引入头文件math.h
// 使用 round 函数精确到小数点后两位
math = round(math * 100) / 100;
c = round(c * 100) / 100;
english = round(english * 100) / 100;
步骤拆解
1. 变量 * 100
首先将原始的浮点数乘以 100,这一步的目的是将小数点向右移动两位。例如,若原始浮点数为 3.14159
,乘以 100 后得到 314.159
。这样做是为了让原本小数点后第二位及以后的数字移动到整数部分,方便后续进行四舍五入操作。
2. round()
函数
round()
是 <math.h>
头文件中定义的一个标准库函数,它的作用是对一个浮点数进行四舍五入取整。
当传入 round(变量 * 100)
时,会对乘以 100 后的结果进行四舍五入操作。
以 314.159
为例,round(314.159)
的结果为 314
;若原始浮点数是 3.146
,乘以 100 得到 314.6
,round(314.6)
的结果则为 315
。
通过 round()
函数,我们实现了对原始浮点数 小数点后第三位 进行四舍五入的操作。
3. / 100
最后将四舍五入取整后的结果除以 100,这一步是将之前乘以 100 时向右移动的小数点再向左移动两位,恢复到原来的位置。
例如,经过四舍五入得到的 314
除以 100 后得到 3.14
,315
除以 100 后得到 3.15
。这样就完成了将原始浮点数精确到小数点后两位的处理。
由此,问题得以解决。
#include <stdio.h>
#include <math.h>
int main()
{
int num = 0;
float math = 0.0;
float c = 0.0;
float english = 0.0;
scanf("%d;%f,%f,%f",&num,&math,&c,&english);
math = round(math * 100) / 100;
c = round(c * 100) / 100;
english = round(english * 100) / 100;
printf("The each subject score of No. %d is %.2f, %.2f, %.2f.",num,math,c,english);
return 0;
}