首页 > 解决方案 > 我不知道为什么 else if 语句没有发生

问题描述

当我输入0.50或其他可以除以的浮点数时,0.25我没有收到任何错误,但是当我输入0.10或其他不能被我编写0.25elseif 语句除的浮点数时,不会发生。谁能告诉我为什么?

#include <cs50.h>
#include <stdio.h>
#include <math.h>

int main(void) {
    float change;
    do {
        change = get_float("Change owed: ");        
    } while (change < 0.009);
    int count = 0;
    int div = 0;
    while (change > 0.00) {
        if ((change / 0.25) >= 1.00) {
            div = round(change / 0.25);
            count += div;
            change = change - (div  *0.25);
        } else
        if ((change / 0.10) >= 1.00) {
            div = round(change / 0.10);
            count += div;
            change = change - (div * 0.10);
        } else
        if ((change / 0.05) >= 1.00) {
            div = round(change / 0.05);
            count += div;
            change = change - (div * 0.05);
        } else {
            div = round(change / 0.01);
            count += div;
            change = change - (div * 0.01);
        }
    }
    printf("%i\n", count);
}

标签: ccs50

解决方案


浮点数 C 的内部表示几乎总是IEEE 754 二进制表示中指定的二进制格式,而不是十进制形式。因此,一些数字在十进制表示法中具有简单的表示,例如在 a甚至在变量0.1中没有精确表示。将此变量乘以不一定会产生精确的值,而是与 不同的非常接近的浮点数。比较浮点数时应该非常小心,考虑到舍入方法的传播带来的微小差异。特别是,您应该避免使用或floatdouble1011floatdouble对于精确的美分数很重要的货币值:使用一个整数来保存美分的数量,并具有足够大的大小来处理计算出的数字。对于以美分表示的超过 2000 万美元的数字,常规 32 位int是不够的。

这是使用long int至少 32 位大小的修改版本:

#include <cs50.h>
#include <stdio.h>
#include <math.h>

int main(void) {
    float change = get_float("Change owed: ");        
    long int cents = round(change * 100); // get an exact number of cents.
    long int count = cents / 25;  // number of quarters
    cents %= 25;
    count += cents / 10;     // number of dimes
    cents %= 10;
    count += cents / 5;      // number of nickels
    cents %= 5;
    count += cents;          // number of pennies
    printf("%ld coins\n", count);
    return 0;
}

推荐阅读