Есть класс Money:
class Money
{
private:
unsigned long rouble;
unsigned char penny;};
Есть конструктор:
Money::Money(const double money)
{
double intpart;
double frac = modf(money, &intpart);
if (intpart < 0) {
ok = false;
}
while (frac > 100)
{
frac--;
intpart += 1;
}
penny = static_cast<unsigned long>(deleteDot(frac));
rouble = static_cast<unsigned long>(intpart);
}
При передаче допустим 1.2232, выдаёт 1,184. Прошёлся отладчиком, но таки не понял почему так происходит.
Метод deleteDot
:
double Money::deleteDot(double &frac)
{
int x, value = 10;
std::stringstream ss;
std::string ncbc; //numeral_count_before_comma
rouble = (int)frac;
ss << frac - (int)frac; //1.12-1=0.12
ncbc = ss.str();
size_t pos = ncbc.find('.');
if (pos != ncbc.npos)
{
x = ncbc.size() - 1 - pos;
}
for (int i = 1; i < x; i++)
{
value *= 10;
}
frac -= (int)frac;
frac *= value;
return frac;
}
В этом как раз никакой загадки.
Для 1.2232 ваша функция deleteDot
возвращает 2232, каковое число при преобразовании в ungigned char
(хотя вы и пишете unsigned long
)
penny = static_cast<unsigned long>(deleteDot(frac));
обрезается до 184.
Как правильно написать deleteDot
, вы не спрашивали :)
Но намекну - берите дробную часть, не пытайтесь работать со строковым представлением. Умножайте на 100 и округляйте до целого так, как вам нужно.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть библиотека которая общается с устройством либо через usb, либо через ethernet, либо еще через что тоИ хотелось бы что бы передать в конструктор...
Подскажите, как задать время для перехода на следующий ActivityОбъясню для чего
Есть в тесте такой кусок кодаРаботает только, если само приложение было запущено ранее
Как создать аннотацию, которая выводила бы логи для любого метода, при помощи прокси