यह एक टेम्पलेट फ़ंक्शन का उपयोग करने वाला आधुनिक सी ++ दृष्टिकोण है जो फ्लोट, डबल, लॉन्ग, इंट और शॉर्ट (लेकिन लंबे समय तक और उपयोग किए गए दोहरे मानों के कारण लंबे डबल के लिए नहीं) के लिए काम कर रहा है।
#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));
}