Как умножить сумму денег на дробное число?

130
30 ноября 2019, 17:30

Есть вариант:

class Money
{
private:
    unsigned long long rouble;
    unsigned char penny;
public:
Money operator *(const Money & m1, double m2)
{
    Money m_temp; 
    double rouble_float = m1.rouble + m1.kopek / 100; //преобразуем имеющиеся рубли с копейками в формат с плавающей точкой
    rouble_float *= m2; //умножаем пред. результат со вторым числом
    double integer; //создаём доп. переменную для хранения целой части числа с плавающей точкой. Она нужна для функции modf         
    m_temp.kopek = static_cast<unsigned char>(modf(rouble_float, &integer) * 100); //static_cast'ом говорим, что нам надо преобразовать тип double в тип unsigned char, т.е. отбрасываем точку. Умножаем на 100, т.к. хвост у нас дробный
    m_temp.rouble = static_cast<unsigned long long>(integer);        //то же самое, но уже для целой части (рубли)
    return m_temp;
}

Можно ли умножить без хранения денег в double или float? Если да, то как?

Answer 1

Делайте наоборот - не копейки делить на 100, а рубли умножать, тогда получится целое число.

Money operator *(const Money & m1, double m2)
{
    Money m_temp; 
    long amount= m1.rouble *100 + m1.kopek; // сумма в копейках
    amount *= m2; 
    и дальше разделяйте результат на рубли и копейки как вам нравится.
}

Но вообще более правильный подход изначально хранить денежные суммы в копейках и тогда не возникает проблем с дробными числами.

Answer 2

Я не очень понял Вас, но почему нельзя сделать так:

Money operator *(const Money & m1, double m2)
{
    double rubl_part = ((double) m1.rouble) * m2*100;
    double kopey_part = ((double) m1.kopek) *m2;
    double sum = rubl_part+kopey_part;
    //Дальше Ваши преобразования
    Money m_temp; 
    m_temp.rouble = static_cast<unsigned long long>(sum/100);  
    m_temp.kopek = static_cast<unsigned char>(sum-m_temp.rouble*100); 
    return m_temp;
}

Пишу с мобилы из метро, поэтому код не проверял, но мне кажется что это проще, чем Ваш исходный вариант.

READ ALSO
Как узнать тип специализации переменной?

Как узнать тип специализации переменной?

Теперь, нужно объявить переменную b такого типа, который является специализацией a(В данном случае int, а если бы было A< double > a, то b должна была...

110
Вывод содержимого файла Java

Вывод содержимого файла Java

Есть такие блоки кода:

153
Сравнение чисел типа Integer в ArrayList с помощью == и equals()

Сравнение чисел типа Integer в ArrayList с помощью == и equals()

Задача: 1) ввести 10 цифр с клавиатуры, 2) вывести длину самой длинной последовательности повторяющихся чисел в списке

143