此问题已在此处有答案:
Is floating point math broken?(33答案)
上个月关门了。
作为一个初学者,我正在编写一个C程序。
#include <stdio.h>
int main() {
int speed, limit_num;
printf("please input :\n");
scanf("%d %d", &speed, &limit_num);
if ((float)speed >= limit_num * 1.5)
{
printf("Exceed %.0f%%. License Revoked\n", (float)(speed - limit_num)/limit_num * 100);
}
else if ((float)speed >= (limit_num * 1.1))
{
printf("Exceed %.0f%%. Ticket 200\n", (float)(speed - limit_num)/limit_num * 100);
}
else
{
printf("OK!\n");
}
return 0;
}
如果我输入“110 100”,输出是“OK”。
但理论上,我认为应该是“超过10%。Ticket 200”,因为(float)speed表示浮点值,limit*1.1的结果表示浮点值。
我尝试添加以下代码
printf("%f, %f\n", (float)limit_num * 1.1, (limit_num *1.1));
输入“110 100”,这里是输出
110.000000, 110.000000
从这个Angular 来看,它并没有解决我的困惑。
希望能得到帮助,谢谢。
2条答案
按热度按时间8yparm6h1#
正如@mch在上面的评论中所阐述的,以及在链接文章中所解释的,浮点数只能近似大多数小数值(由于base 10-base 2的差异和非无限位数)。
车速通常以整数表示。
OP代码提出了两个 * 阈值 *(110和150),司机将受到处罚。
解决这个问题的另一种方法是认识到,速度高达109是“好吧!”,并以149的速度进行罚款。它是在,或超过,阈值是相关的。可悲的是,“at”(相等)在处理浮点值时可能很棘手。
下面是解决这个难题的另一种方法:
就用有用的吧...
lyfkaqu12#
通常,摆脱浮点数的方法是将两边都乘以一个足够大的数字,这样就不需要分数了。在这种情况下,两边都乘以10。