Boost cpp_dec_float поддерживает работу модуля

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

2

Решение

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

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
2

Другие решения