cpp_dec_floatをroundダウンします
-
21-12-2019 - |
質問
.str(n, std::ios_base::scientific)
を使用してccp_dec_float
sを印刷しています。
それが回転することに気づいた。
会計のためにcpp_dec_float
を使用しているので、私は下向きに丸める必要があります。これはどのようにして行うことができますか?
解決
それは切り上げません。実際には、銀行家のラウンドを見ますか:それを見てください。>
#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
.
だからあなたが別の種類の丸めが欲しいならば、あなたはそれを明示的に書きたいのです
これは一般的なアプローチです( コリル )
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;
}
.
これは、静的に既知のスケールファクタのために最適なコードと式テンプレートの使用を抑制します。
他のヒント
私はあなたが特定の小数点の四捨五入を達成しようとしている、正しい?
標準丸め
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);
}
.
頑張って!
所属していません StackOverflow