Russian Qt Forum
Ноябрь 01, 2024, 06:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос по QString::toDouble()  (Прочитано 3020 раз)
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()? Может локаль какую высставить?
Записан
Vass
Гость
« Ответ #1 : Сентябрь 26, 2011, 20:18 »

округлять, с помощью qRound
числа с плавающей точкой, это числа с плавающей точкой
по идее в a оказывается не 1.5, а скажем 1.499999(9)
в результате получается число 4.999999(9) вместо пяти,
но прямое приведение к int просто отбрасывает дробную часть  и ты получаешь 4.
qRound это аналог stl'евской round из math.h
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #2 : Сентябрь 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?
Это резултат оптимизации кода компилятором.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.074 секунд. Запросов: 23.