Russian Qt Forum

Qt => Вопросы новичков => Тема начата: gimnazist от Сентябрь 26, 2011, 19:15



Название: Вопрос по QString::toDouble()
Отправлено: gimnazist от Сентябрь 26, 2011, 19:15
Столкнулся с такой ситуацией:

Код
C++ (Qt)
   double a = 1.5;
   double b = 1.0;
   double c = 0.1;
   int d;
 
   d = (a - b) / c;
   qDebug() << "d1 = " << d;    //d == 5
   d = (a * 100 - b * 100) / c;
   qDebug() << "d1 x100 = " << d;    //d x100 == 500
 
   QString str = "1.5";
   a = str.toDouble();
   d = (a - b) / c;
   qDebug() << "d2 = " << d;    //d == 4
   d = (a * 100 - b * 100) / c;
   qDebug() << "d2 x100 = " << d;    //d x100 == 499

Т.е. при получении дабла из строки методом toDouble() получается такое вот.
Как получить число 1.5 используя toDouble()? Может локаль какую высставить?


Название: Re: Вопрос по QString::toDouble()
Отправлено: Vass от Сентябрь 26, 2011, 20:18
округлять, с помощью qRound
числа с плавающей точкой, это числа с плавающей точкой
по идее в a оказывается не 1.5, а скажем 1.499999(9)
в результате получается число 4.999999(9) вместо пяти,
но прямое приведение к int просто отбрасывает дробную часть  и ты получаешь 4.
qRound это аналог stl'евской round из math.h


Название: Re: Вопрос по QString::toDouble()
Отправлено: LisandreL от Сентябрь 26, 2011, 20:29
В отладочной версии:
d1 =  4
d1 x100 =  499
d2 =  4
d2 x100 =  499

Проблема в c = 0.1 - она не представима в виде конечной двоичной дроби.
Для сравнения:
Код:
    double a = 1.5;
    double b = 1.0;
    double c = 10;
    int d;

    d = (a - b) * c;
    qDebug() << "d1 = " << d;    //d == 5
    d = (a * 100 - b * 100) * c;
    qDebug() << "d1 x100 = " << d;    //d x100 == 500

    QString str = "1.5";
    a = str.toDouble();
    d = (a - b) * c;
    qDebug() << "d2 = " << d;    //d == 5
    d = (a * 100 - b * 100) * c;
    qDebug() << "d2 x100 = " << d;    //d x100 == 500

Почему в релизной версии в первом случае получается 5 и 500?
Это резултат оптимизации кода компилятором.