นี่เป็นวิธีการ c ++ ที่ทันสมัยโดยใช้ฟังก์ชั่นเทมเพลตซึ่งทำงานสำหรับ float, double, long, int และ short (แต่ไม่ใช่สำหรับ long long และ long double เนื่องจาก double values ใช้แล้ว)
#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
ตัวอย่างของฉันจากข้างต้นจะถูกปัดเศษใช้
สร้างฟังก์ชั่นเทมเพลต "round up" หรือรู้จักกันในชื่อ "round ceiling" ดังที่แสดงด้านล่าง:
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));
}
สร้างฟังก์ชันเทมเพลต "round down" หรือรู้จักกันในชื่อ "round floor" ดังที่แสดงด้านล่าง:
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));
}