приведение двойного к целому без округления - PullRequest
0 голосов
/ 16 января 2019

Я не понимаю, почему, когда я пытаюсь привести мой дубль к значению int после того, как запятые округлены ..

void print_float(double nb)
{
    int negative;
    int intpart;
    double decpart = -10.754;
    int v;

    negative = (nb < 0.0f);
    intpart = (int)nb;
    decpart = nb - intpart;
    v = (int)(decpart * 1000);

    if (negative) {
        v *= -1;
    }

    printf("%i.%i", intpart, v); // output: -10.753
}

Наверное, подумав, что беспокойство исходит от актеров, но я не понимаю проблемы ..

1 Ответ

0 голосов
/ 16 января 2019

A double не может точно закодировать все числа. Он может точно кодировать около 2 64 различных значений. -10.754 не является одним из них. Вместо этого соседнее значение используется чуть меньше, чем ожидалось.

printf("%.24f", -10.754);
// -10.753999999999999559463504

Часть decpart * 1000 привносит некоторую неточность, но продукт все еще ниже 754,0, а затем (int) дает 753.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...