Как видно из названия, Boost’s cpp_dec_float
операции поддержки модуля? Я имею дело с деньгами и хотел бы выполнить некоторые операции модуля, чтобы получить количество банкнот и монет, которые мне нужно вернуть. cpp_dec_float
кажется, единственный класс произвольной точности, который поддерживает базу 10.
Если все, что вам нужно, это раздача монет, разве вы не можете сделать это без модуля?
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