强制cpp_dec_float向下舍入

时间:2014-04-12 15:47:07

标签: c++ boost rounding multiprecision

我正在使用.str(n, std::ios_base::scientific)来打印ccp_dec_float s。

我注意到它已经完成了。

我使用cpp_dec_float进行会计处理,所以我需要向下舍入。怎么办呢?

2 个答案:

答案 0 :(得分:3)

它没有围捕。事实上,它是银行家的一员:看到它 Live On Coliru

#include <boost/multiprecision/number.hpp>
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <iostream>

namespace mp = boost::multiprecision;

int main()
{
    using Dec = mp::cpp_dec_float_50;

    for (Dec d : { 
            Dec( "3.34"),   Dec( "3.35"),   Dec( "3.38"),
            Dec( "2.24"),   Dec( "2.25"),   Dec( "2.28"),
            Dec("-2.24"),   Dec("-2.25"),   Dec("-2.28"),
            Dec("-3.34"),   Dec("-3.35"),   Dec("-3.38"),
            })
    {
        std::cout     << d.str(2, std::ios_base::fixed) 
            << " -> " << d.str(1, std::ios_base::fixed) << "\n";
    }
}

打印:

3.34 -> 3.3
3.35 -> 3.4
3.38 -> 3.4
2.24 -> 2.2
2.25 -> 2.2
2.28 -> 2.3
-2.24 -> -2.2
-2.25 -> -2.2
-2.28 -> -2.3
-3.34 -> -3.3
-3.35 -> -3.4
-3.38 -> -3.4

因此,如果你想要另一种舍入,你想要明确地写它

这是一种通用方法( Live On Coliru

template <int decimals = 0, typename T>
T round_towards_zero(T const& v)
{
    static const T scale = pow(T(10), decimals);

    if (v.is_zero())
        return v;

    // ceil/floor is found via ADL and uses expression templates for optimization
    if (v<0)
        return ceil(v*scale)/scale;
    else
        // floor is found via ADL and uses expression templates for optimization
        return floor(v*scale)/scale;
}

由于静态已知的比例因子以及在Boost Multiprecision库中使用表达式模板,希望能够编译成最佳代码。

答案 1 :(得分:1)

我假设您正在尝试舍入到某个小数点,对吗?

标准舍入

double rounding_func(double in, double precision){
   return round(in*pow(10,precision))/pow(10,precision);              
}

但正如你的标题所说,你试图强迫它向下舍入,所以考虑

double rounding_func(double in, double precision){
   return floor(in*pow(10,precision))/pow(10,precision);              
}
祝你好运!