Boost cpp_dec_float支持模运算

时间:2014-08-27 04:38:36

标签: c++ boost modulus arbitrary-precision

正如标题所说,Boost的cpp_dec_float支持模数运算?我正在处理金钱,并希望进行一些模数运算,以获得我需要返还的账单和硬币的数量。 cpp_dec_float似乎是支持基数10的唯一任意精度类。

1 个答案:

答案 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