正如标题所说,Boost的cpp_dec_float
支持模数运算?我正在处理金钱,并希望进行一些模数运算,以获得我需要返还的账单和硬币的数量。 cpp_dec_float
似乎是支持基数10的唯一任意精度类。
答案 0 :(得分:2)
如果你想要的只是硬币发行,你不能不用模数做到吗?
Boost multiprecision确实为后端类型定义fmod,trunc,mod等;这是一个有效的演示: Live On Coliru
#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