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