Russian Qt Forum

Программирование => Общий => Тема начата: serg_hd от Июль 15, 2013, 11:54



Название: [SOLVED] QDoubleSpinBox, double, int
Отправлено: serg_hd от Июль 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 всё ок. Спасибо.


Название: Re: QDoubleSpinBox, double, int
Отправлено: m_ax от Июль 15, 2013, 11:59
Теневая экономика)


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


Название: Re: QDoubleSpinBox, double, int
Отправлено: m_ax от Июль 15, 2013, 12:27
Возможно здесь qDebug округляет money при выводе..


Название: Re: QDoubleSpinBox, double, int
Отправлено: m_ax от Июль 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> подключить..


Название: Re: QDoubleSpinBox, double, int
Отправлено: serg_hd от Июль 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 выводит это дело по-своему.