浮点数四舍五入的精确度问题

        在做牛客题霸的一道基础语法题时,遇到了浮点数四舍五入的问题。

                对于输入的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.6round(314.6) 的结果则为 315

通过 round() 函数,我们实现了对原始浮点数 小数点后第三位 进行四舍五入的操作。

3. / 100

最后将四舍五入取整后的结果除以 100,这一步是将之前乘以 100 时向右移动的小数点再向左移动两位,恢复到原来的位置。

例如,经过四舍五入得到的 314 除以 100 后得到 3.14315 除以 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值