c++, static_cast ‹int› вычисления с плавающей запятой и возможной потери целых чисел

Со следующим кодом:

    int ten{ 1 };
    double zeroPnine{ 0.9 };

    cout << ten - zeroPnine << endl; // 0.1
    cout << (ten - zeroPnine) * 10 << endl; // 1
    cout << static_cast <int>(ten - zeroPnine) << endl; // 0    
    cout << static_cast <int>((ten - zeroPnine) * 10 )<< endl; // 1

Я ожидаю, что последняя строка выведет 1, но фактический вывод на самом деле 0, почему?

Полный вывод: 0,1
1
0
0


person user97662    schedule 19.02.2015    source источник
comment
Из-за неточностей формата с плавающей запятой на компьютерах, что может привести к ошибкам округления.   -  person Some programmer dude    schedule 19.02.2015
comment
Если вы распечатаете последнюю строку без статического приведения, она покажет 1 или, по крайней мере, что-то близкое к 1. Но если вы скажете ((ten - zeroPnine) * 10) == 1, она скажет false по причине, которую заявляет Иоахим. Значения неточны. Для относительных значений следует полагаться на плавающие точки, а не на дискретные точки.   -  person Silvio Mayolo    schedule 19.02.2015
comment
Кстати, 0.9 не является целым числом.   -  person    schedule 19.02.2015
comment
Я понимаю, что 0,9 не является целым числом, но 1 - 0,9 = 0,1, а 0,1 * 10 должно дать мне 1, почему это проблема?   -  person user97662    schedule 19.02.2015
comment
Из-за того, как работают числа с плавающей запятой, 0.9 на самом деле 0.90000000000000002220446049250313080847263336181640625   -  person molbdnilo    schedule 19.02.2015
comment
возможный дубликат двойной точности C++   -  person Werner Henze    schedule 19.02.2015


Ответы (1)


Лучшим советом будет избегать использования static_cast для преобразования double.

Попробуйте преобразовать double в int перед выполнением вычислений, если вы хотите, чтобы ответ был целым числом.

person just_another_person    schedule 20.02.2015