(先上题目)
描述
依次输入一个学生的学号,以及3科(C语言,数学,英语)成绩,在屏幕上输出该学生的学号,3科成绩(注:输出成绩时需进行四舍五入且保留2位小数)。
输入描述:
学号以及3科成绩,学号和成绩之间用英文分号隔开,成绩之间用英文逗号隔开。
输出描述:
学号,3科成绩,输出格式详见输出样例。
示例1
输入:
17140216;80.845,90.55,100.00
输出:
The each subject score of No. 17140216 is 80.85, 90.55, 100.00.
(本人菜鸟,代码看看就行)
#include<stdio.h>
int main()
{
int id; float arr[3];
scanf("%d;%f,%f,%f", &id, arr, arr + 1, arr + 2);
for (int i = 0; i < 3; i++)
{
arr[i] += 0.005;
arr[i] *= 100;
int tmp = arr[i];
arr[i] = tmp / 100.0;
}
printf("The each subject score of No. %d is %.2f,%.2f,%.2f",
id,
*arr,
*(arr + 1),
*(arr + 2));
return 0;
}
(此时运行结果无问题,下面换上double)
(而此时运行后却没有成功进一)
随后上网搜索,有老铁说比如保留两位时给第三位直接加上0.005。然而我只知道保留正整数的时候可以加0.5,负整数就减去0.5。
手动测试:
(结果好像是正确的,可把我高兴坏了,终于把这玩意搞懂了。结果又测了两下:)
(换上double)
发现就很。。。。。然后又找了好一阵,发现了一位大佬的宝藏博客。大佬在他的博客中列举了许多相关测试的例子,总结出来浮点数的保留真就没啥捷径。最笨的办法就是把小数点后所要保留位数的下一位数给取出来,判断大小,四舍五入。笨方法虽然麻烦(吐槽),但绝对不会有问题。
下面附上用0.5来进行四舍五入的方法:(保留整数)