এটি একটি টেমপ্লেট ফাংশন ব্যবহার করে আধুনিক সি ++ পদ্ধতির যা ভাসমান, ডাবল, দীর্ঘ, অন্তর্ এবং সংক্ষিপ্ত (তবে দীর্ঘ দীর্ঘ নয় এবং ব্যবহৃত দ্বিগুণ মানের কারণে দীর্ঘ দ্বিগুণ) জন্য কাজ করছে।
#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
। উপরে থেকে আমার উদাহরণ ব্যবহার rounding করা হয় 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));
}