力cpp_dec_float到本轮下跌 [英] Force cpp_dec_float to round down
问题描述
我使用名为.str(N,性病:: ::的ios_base科学)
打印 ccp_dec_float
秒。
我已经注意到,它向上舍入。
I've noticed that it rounds up.
我使用 cpp_dec_float
会计,所以我需要向下舍入。如何才能做到这一点?
I am using cpp_dec_float
for accounting, so I need to round downward. How can this be done?
推荐答案
它不圆了。事实上,它确实银行家轮:看到它的 住在Coliru
It doesn't round up. In fact, it does banker's round: See it 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
所以,如果你想另一种舍入,你想把它明确写入
So if you want another kind of rounding, you'd want to write it explicitly
下面是一个通用的方法( 住在Coliru )
Here's a generic approach (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;
}
这希望编译成最佳code,由于静态已知比例因子和使用的的前pression模板的Boost中多precision库。
which hopefully compiles down to optimal code due to statically known scale factor and the use of expression templates in Boost Multiprecision library.
这篇关于力cpp_dec_float到本轮下跌的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!