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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [SOLVED] QDoubleSpinBox, double, int  (Прочитано 4290 раз)
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« : Июль 15, 2013, 11:54 »

В слоте для сигнала valueChanged(), который у QDoubleSpinBox'а, имею:
Код
C++ (Qt)
void struct1:moneyChangedSlot(double money)
{
boost::int64_t action_money = static_cast<boost::int64_t>(money * 100);
qDebug() << "money: " << money << "; action_money: " << action_money;
}
 
output:
money:  5.05 ; action_money:  504

Почему, если money равен 5.05, то action_money равен 504, а не 505? Это как пример. На самом деле поведение какое-то хаотичное. Например, при том же money == 5.03 всё ок. Спасибо.
« Последнее редактирование: Июль 15, 2013, 13:12 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #1 : Июль 15, 2013, 11:59 »

Теневая экономика)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #2 : Июль 15, 2013, 12:02 »

Теневая экономика)
Я давно понял, что при юзании денег лучше использовать int (то есть все деньги - только центы), проблем с этим совершенно никаких. Только при отображении под рукой иметь транслятор для деления на 100=).
С даблами была полная жопа. Но тут мне надо чтобы юзер выбрал деньги с помощью QDoubleSpinBox'а, а в слоте такая вот хрень происходит.
Записан

kubuntu/Win7/x64/NetBeans
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #3 : Июль 15, 2013, 12:27 »

Возможно здесь qDebug округляет money при выводе..
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #4 : Июль 15, 2013, 12:46 »

Попробуйте, вместо qDebuga std::cerr:

Код
C++ (Qt)
void struct1:moneyChangedSlot(double money)
{
boost::int64_t action_money = static_cast<boost::int64_t>(money * 100);
std::cerr << "money: " << std::setprecision(8) << money << "; action_money: " << action_money;
}
 
 

Для std::setprecision нужно будет <iomanip> подключить..
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #5 : Июль 15, 2013, 13:11 »

Попробуйте, вместо qDebuga std::cerr:

Код
C++ (Qt)
void struct1:moneyChangedSlot(double money)
{
boost::int64_t action_money = static_cast<boost::int64_t>(money * 100);
std::cerr << "money: " << std::setprecision(8) << money << "; action_money: " << action_money;
}
 
 

Для std::setprecision нужно будет <iomanip> подключить..

Так тоже нет. Но получилось так:

Код
C++ (Qt)
void struct1:moneyChangedSlot(double money)
{
boost::int64_t action_money = qRound(money * 100);
 
//...
}
 

По всей видимости, double в слоте не 5.01 (как пример), а 5.0099999999999 или типа того. Ну и std::cout выводит это дело по-своему.
Записан

kubuntu/Win7/x64/NetBeans
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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