习题3-2 高速公路超速处罚
程序员文章站
2022-06-08 17:06:19
...
题目描述
题目分析
小屁孩为什么要写这篇博客呢,这道题本身并没有难度,但很多初学程序设计语言的朋友在这道题上会遇上一个让人特别头疼的问题,明明程序没什么问题,但为什么测试的时候就会出问题呢?尤其是输入样例二,输出结果为什么会是OK呢?先给大家看一看代码。
#include<stdio.h>
int main (void){
int v,l;//v是车速,l是限速
double x;
scanf("%d %d",&v,&l);
if(v-l<l*0.1){
printf("OK");
}
else if(v<l*1.5){
x=(v-l)*1.0/l*100;
printf("Exceed %.0f%%. Ticket 200",x);
}
else{
x=(v-l)*1.0/l*100;
printf("Exceed %.0f%%. License Revoked",x);
}
return 0;
}
可能大家对这段代码有疑问:
if(v-l<l*0.1){
printf("OK");
}
为什么要写成v - l < l * 0.1而不能写成v < 1.1 *l 呢?肯定是这样写有问题,因为浮点数存在精确度的问题,当你输入 v = 110,l = 100时,你认为此时v == 1.1 * l,实际上可能是这样的 110 < 110.00000000000001,后者是我亲自实验计算机输出的值,我记得还有一个专有名词形容,但是我一时想不起来。那你可能又会有疑问了,为什么后面的v < l * 1.5又没有问题呢?这个你就要问计算机了,浮点数的脾气就是这么古怪,喜怒无常。如果你写成v < 1.1 *l 还是不行,那么你可以尝试其他的等价表达。
让你们直观的看看浮点数的小脾气:
我相信现在大家应该知道是怎么回事了,如有错误之处,欢迎大家指正,可以随时评论留言。
上一篇: MVC模式中的面向对象疑问