Всякий раз, когда я ввожу 4.2 в этом коде, значение nm равно 19, где ожидается 20 - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь получить 20 в переменной нм. Но возвращается 19.

Как мне это исправить? И что вызывает эту проблему?

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

int main(void)
{

    float m;

    int n = 0;
    do {
         m = get_float("Enter:");

        }while(m < 0);
    int nm =(m * 100 );
    while(nm >= 25 ){
        nm = nm - 25;
        n = n + 1;

    }

    printf("%i\n",n);
    printf("%i\n", nm);
}

1 Ответ

0 голосов
/ 19 ноября 2018

32-битный float может кодировать около 2 32 различных значений точно . Из-за бинарной природы типичного float , 4.2 не является одним из них.

Вместо m имеет значение 4.1999998...

// closest float
4.19999980926513671875
// hoped for value
4.2
// next closest float
4.200000286102294921875

Мультиплексирование на 100 влечет за собой некоторое округление, и тогда лучший ответ на m*100 будет 419.999969482421875.

int nm =(m * 100 ); результаты nm == 419, так как присвоение float - int усекает дробную часть.


Рассмотрим округление до ближайшего целого, а не усечение с помощью присваивания int и использование double констант.

#include <math.h>

// int nm =(m * 100 );
int nm = lround(m * 100.0);
// or 
int nm = round(m * 100.0);
...