Кастинг меняет значение странным образом - PullRequest
5 голосов
/ 14 августа 2011

Почему a1=72 вместо 73 в этом (ужасном) фрагменте кода C ++?

#include <iostream>
#include <string>

using namespace std;

int main (int argc, char* argv[])
{   
    double       a  = 136.73;
    unsigned int a1 = (100*(a-(int)a));

    cout << (a-(int)a)     << endl; // 0.73
    cout << 100*(a-(int)a) << endl; // 73
    cout << a1             << endl; // 72 !
}

Вы можете выполнить его на http://codepad.org/HhGwTFhw

Ответы [ 4 ]

8 голосов
/ 14 августа 2011

Если вы увеличите точность вывода, вы увидите, что (a - (int) a) печатает 0.7299999999999898.

Следовательно, усечение этого значения (которое вы получаете, когда вы приводите его к int), действительно 72.

(обновленная кодовая панель здесь .)

5 голосов
/ 14 августа 2011

Это распространенная проблема точности.Литерал 136.73 фактически означает число

136.729999999999989768184605054557323455810546875

, а результат a-(int)a - это не 0.73 (хотя это и отображается), а скорее

0.729999999999989768184605054557323455810546875

Когда вы умножаете это на 100, вы получаете

72.9999999999989768184605054557323455810546875

И, поскольку преобразование из двойного в целое число обрезает все после десятичной точки, вы получаете 72.

4 голосов
/ 14 августа 2011

Это может стать понятным, если вы прочитаете следующую статью: Что должен знать каждый компьютерный ученый об арифметике с плавающей запятой .

Другие уже показали, что результат (a - (int)a)не совсем 0,73, но чуть ниже.В статье объясняется , почему это так.Это не совсем легко читать, но на самом деле каждый, кто работает с FP, должен прочитать и попытаться понять, IMO.

4 голосов
/ 14 августа 2011

0.73 не может быть представлено точно, поэтому оно округляется до числа, близкого к нему, которое в этом примере меньше 0.73. при умножении на 100 вы получаете 72.[something], который позже обрезается до 72.

подробнее

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