在这个C程序中感到困惑关于整数值和浮点值[重复]

ntjbwcob  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(97)

此问题已在此处有答案

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 来看,它并没有解决我的困惑。
希望能得到帮助,谢谢。

8yparm6h

8yparm6h1#

正如@mch在上面的评论中所阐述的,以及在链接文章中所解释的,浮点数只能近似大多数小数值(由于base 10-base 2的差异和非无限位数)。
车速通常以整数表示。
OP代码提出了两个 * 阈值 *(110和150),司机将受到处罚。
解决这个问题的另一种方法是认识到,速度高达109是“好吧!”,并以149的速度进行罚款。它是在,或超过,阈值是相关的。可悲的是,“at”(相等)在处理浮点值时可能很棘手。
下面是解决这个难题的另一种方法:

#include <stdio.h>

#define EXCESS_LO 10 // penalty threshold is 10% over limit
#define EXCESS_HI 50 // harsher penalty for 50% over limit and above

int main( void ) {
    int speed, limit_num;

    printf( "please input :\n" );
    if( scanf( "%d %d", &speed, &limit_num ) != 2 ) { // ALWAYS verify input succeeded
        fprintf( stderr, "Bad input\n" );
        exit(1);
    }

    float excess = (float)(speed - limit_num) / limit_num * 100;
    if( excess < EXCESS_LO ) // less than 10% excess is allowed
        puts( "OK!" );
    else {
        printf( "Exceed %.0f%%. ", excess )
        // 10% to 49.9999% => fine imposed. 50% or more means cycling to work.
        if( excess < EXCESS_HI )
            puts( "Ticket 200" );
        else
            puts( "License Revoked" );
    }

    return 0;
}

就用有用的吧...

lyfkaqu1

lyfkaqu12#

通常,摆脱浮点数的方法是将两边都乘以一个足够大的数字,这样就不需要分数了。在这种情况下,两边都乘以10。

if (speed * 10 >= limit_num * 15)
else if (speed * 10 >= limit_num * 11)

相关问题