c++ - Boost cpp_dec_float 支持模运算

标签 c++ boost modulus arbitrary-precision

正如标题所说,Boost的cpp_dec_float支持取模运算吗?我正在处理金钱,并想做一些模数运算来获取我需要归还的钞票和硬币的数量。 cpp_dec_float 似乎是唯一支持基数 10 的任意精度类。

最佳答案

如果你想要的只是硬币分配,你不能只做不取模吗?

Boost 多精度确实为后端类型定义了 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

关于c++ - Boost cpp_dec_float 支持模运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25519001/

相关文章:

C++删除数字的第一位和最后一位

c++ - 如何使用 CMake 设置 MSVC 目标平台版本?

c++ - 产量 boost::asio::coroutine 直到任务完成

c++ - 在 Release模式下 boost ASIO 段错误

javascript - Node.js/Express 应用程序中的内存消耗

python - 在 for 循环的每次迭代中使用不同的除数创建可整除数字的列表

c++ - C++中的共享字符串常量

c++ - operator<< 打印一个底层类型为 short 的枚举值是不明确的

具有重载访问器函数的单例上的 C++ 未解析外部

c++ - 将 boost::shared_ptr 与 WSACleanup 结合使用