2014-04-12 8 views
3

.str(n, std::ios_base::scientific)을 사용하여 ccp_dec_float을 인쇄하고 있습니다.cpp_dec_float를 반올림하여 내림

나는 반올림 한 것으로 나타났습니다.

저는 회계를 위해 cpp_dec_float을 사용하고 있습니다. 따라서 아래로 반올림해야합니다. 어떻게 할 수 있습니까?

답변

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

다음은 'round_towards_zero'의 개념 증명입니다. http://coliru.stacked-crooked.com/a/726e31b3565d73c6 – sehe

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);    
} 

행운을 고려!

+0

그래, 그렇게 두 배로 확실히 사용할 수 있습니다. 일어나는 모든 일은 우리가 유지하고자하는 소수 자릿수에 10을 곱하고 나머지 소수점을 반올림 한 다음 10의 거듭 제곱으로 다시 나눕니다. – Outsider

+0

나는 부스트 라이브러리를 사용하지 않았습니다. 솔직히 말해서 왜 작동하지 않는지 나는 알 수 없습니다. 나는 cpp_dec_float가 단지 Boost를 위해 포맷 된 부동 소수점 숫자라고 가정한다. 실제 반올림을 수행하려면 부스트 특정 함수를 사용해야 할 수도 있지만 개념은 작동해야합니다. – Outsider

+1

방금이 내용을 제 답변에 추가했습니다. – sehe