.str(n, std::ios_base::scientific)
을 사용하여 ccp_dec_float
을 인쇄하고 있습니다.cpp_dec_float를 반올림하여 내림
나는 반올림 한 것으로 나타났습니다.
저는 회계를 위해 cpp_dec_float
을 사용하고 있습니다. 따라서 아래로 반올림해야합니다. 어떻게 할 수 있습니까?
.str(n, std::ios_base::scientific)
을 사용하여 ccp_dec_float
을 인쇄하고 있습니다.cpp_dec_float를 반올림하여 내림
나는 반올림 한 것으로 나타났습니다.
저는 회계를 위해 cpp_dec_float
을 사용하고 있습니다. 따라서 아래로 반올림해야합니다. 어떻게 할 수 있습니까?
반올림하지 않습니다. 사실, 라운드 은행의 작업을 수행합니다 참조 그것을 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 라이브러리에서 사용하기 때문에 최적의 코드로 컴파일되기를 바랍니다.
특정 소수점 이하 반올림을 달성했다고 가정합니다. 맞습니까?
표준
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);
}
행운을 고려!
그래, 그렇게 두 배로 확실히 사용할 수 있습니다. 일어나는 모든 일은 우리가 유지하고자하는 소수 자릿수에 10을 곱하고 나머지 소수점을 반올림 한 다음 10의 거듭 제곱으로 다시 나눕니다. – Outsider
나는 부스트 라이브러리를 사용하지 않았습니다. 솔직히 말해서 왜 작동하지 않는지 나는 알 수 없습니다. 나는 cpp_dec_float가 단지 Boost를 위해 포맷 된 부동 소수점 숫자라고 가정한다. 실제 반올림을 수행하려면 부스트 특정 함수를 사용해야 할 수도 있지만 개념은 작동해야합니다. – Outsider
방금이 내용을 제 답변에 추가했습니다. – sehe
다음은 'round_towards_zero'의 개념 증명입니다. http://coliru.stacked-crooked.com/a/726e31b3565d73c6 – sehe