이것은 float, double, long, int 및 short에서 작동하는 템플릿 함수를 사용하는 최신 c ++ 접근법입니다 (그러나 사용되는 double 값으로 인해 long long 및 long double은 아닙니다).
#include <cmath>
#include <iostream>
template<typename T>
T roundMultiple( T value, T multiple )
{
if (multiple == 0) return value;
return static_cast<T>(std::round(static_cast<double>(value)/static_cast<double>(multiple))*static_cast<double>(multiple));
}
int main()
{
std::cout << roundMultiple(39298.0, 100.0) << std::endl;
std::cout << roundMultiple(20930.0f, 1000.0f) << std::endl;
std::cout << roundMultiple(287399, 10) << std::endl;
}
그러나 당신은 쉽게에 대한 지원을 추가 할 수 있습니다 long long
하고 long double
아래와 같이 템플릿 특수화로 :
template<>
long double roundMultiple<long double>( long double value, long double multiple)
{
if (multiple == 0.0l) return value;
return std::round(value/multiple)*multiple;
}
template<>
long long roundMultiple<long long>( long long value, long long multiple)
{
if (multiple == 0.0l) return value;
return static_cast<long long>(std::round(static_cast<long double>(value)/static_cast<long double>(multiple))*static_cast<long double>(multiple));
}
반올림 할 함수를 만들려면 std::ceil
및를 반올림하여 사용하십시오 std::floor
. 위의 예는을 사용하여 반올림 std::round
합니다.
아래와 같이 "라운드 업"또는 "라운드 실링"템플릿 기능으로 잘 알려져 있습니다.
template<typename T>
T roundCeilMultiple( T value, T multiple )
{
if (multiple == 0) return value;
return static_cast<T>(std::ceil(static_cast<double>(value)/static_cast<double>(multiple))*static_cast<double>(multiple));
}
아래와 같이 "라운드 다운"또는 "라운드 플로어"템플릿 기능으로 잘 알려져 있습니다.
template<typename T>
T roundFloorMultiple( T value, T multiple )
{
if (multiple == 0) return value;
return static_cast<T>(std::floor(static_cast<double>(value)/static_cast<double>(multiple))*static_cast<double>(multiple));
}