Đây là cách tiếp cận c ++ hiện đại sử dụng hàm mẫu đang hoạt động cho float, double, long, int và short (nhưng không dài và dài gấp đôi vì các giá trị kép được sử dụng).
#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;
}
Nhưng bạn có thể dễ dàng thêm hỗ trợ cho long long
và long double
với chuyên môn mẫu như dưới đây:
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));
}
Để tạo các chức năng để làm tròn, sử dụng std::ceil
và luôn luôn làm tròn sử dụng std::floor
. Ví dụ của tôi từ trên là làm tròn bằng cách sử dụng std::round
.
Tạo chức năng mẫu "làm tròn" hay còn gọi là chức năng mẫu "trần tròn" như dưới đây:
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));
}
Tạo chức năng mẫu "làm tròn xuống" hay còn gọi là chức năng mẫu "sàn tròn" như dưới đây:
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));
}