对于浮点数的四舍五入问题

发布时间:2024年01月14日

在某一天的刷题中,偶然写道了这道题

写完以后发现没有满分,由此引发了猜想,对于编译器运行时使用

printf("%.1f",3.155);

其它本身就会进行四舍五入所以会出现以下运行结果



但如果我们保留两位小数呢?

啊,不该是输出3.16么?为什么是3.15呢?


我们带着疑问对a进行监视

原来如此,a在存储时不是存的3.155,而是3.15499997,那么自然保留两位小数就是3.15了嘛;


为什么会有误差呢?

原因如下

浮点数在计算机中存储时,小数部分也是按二进制存储的;例如:0.9 十进制转换为二进制是:0.111001100110011001100…无限循环而计算机中存储的位数是有限的,因此当变量存储不了后面的二进制小数时,再转换回十进制就产生误差了float: 单精度浮点数 十进制保存7位置,二进制保存23位0.111001100110011001100…转换回十进制就是:0.89999998double: 双精度浮点_浮点数由于存储空间不够引起的截断误差


回归本题(链接:学生基本信息输入输出_牛客题霸_牛客网 (nowcoder.com)

那么保留两位小数,我们直接在加0.005就可以了嘛

#include <stdio.h>
int main() 
{
	unsigned long long int p;
    double a, b, c;
    scanf("%llu;%lf,%lf,%lf", &p, &a, &b, &c);
	if(a!=0)
	a = a + 0.0005;
	if(b!=0)
	b = b + 0.0005;
	if(c!=0)
	c = c + 0.0005;
    printf("The each subject score of No. %llu is %.2lf, %.2lf, %.2lf.", p, a, b, c);
    return 0;
}

成功!!!

文章来源:https://blog.csdn.net/2301_81265915/article/details/135561529
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。