Увеличить УОЗ поплавок декабря поддерживает работу модуля


Как говорится в названии, поддерживает ли Boost cpp_dec_float операции по модулю? Я имею дело с деньгами и хотел бы сделать некоторые операции по модулю, чтобы получить количество банкнот и монет, которые мне нужно вернуть. cpp_dec_float, по-видимому, является единственным произвольным классом точности, который поддерживает базу 10.

1 2

1 ответ:

Если все, что вы хотите, это распределение монет,не можете ли вы просто сделать это без модуля?

Boost multiprecision определяет fmod, trunc, mod и т. д. когда это возможно для бэкенд-типа; вот рабочая демонстрация: жить на Колиру

#include <boost/multiprecision/cpp_dec_float.hpp>
#include <boost/multiprecision/number.hpp>
#include <iostream>

using Num = boost::multiprecision::number<boost::multiprecision::cpp_dec_float<128>>;

int main()
{
    Num x("189.5307");

    for (Num denom : { 
            Num("500.00"),   Num("200.00"),   Num("100.00"),
             Num("50.00"),    Num("20.00"),    Num("10.00"),
              Num("5.00"),     Num("2.00"),     Num("1.00"),
              Num("0.50"),     Num("0.20"),     Num("0.10"),
              Num("0.05"),     Num("0.02"),     Num("0.01"),
        })
    {
        Num count = x/denom;

        if (count >= 1)
        {
            count = trunc(count);
            std::cout << count << " * " << std::right << std::setw(6) << denom.str(2, std::ios::fixed) << "\n";
            x -= denom * count;
        }
    }

    std::cout << "Remainder: " << x << "\n";
}

Я явно выбрал "недопустимое" входное значение (с избыточной точностью для номиналов), чтобы вы могли проверить, что оно обрабатывает их. Я не беспокоился о случае отрицательных сумм, но вы можете это выяснить:)

1 * 100.00
1 *  50.00
1 *  20.00
1 *  10.00
1 *   5.00
2 *   2.00
1 *   0.50
1 *   0.02
1 *   0.01
Remainder: 0.0007