实现的效果:
1122.51 --> 1122
1122.9 --> 1122 (因为最近的整数是1123,但它是奇数,1122比1124更接近)
1123.0 --> 1124
1、通过Math.Round方法实现
double source = 1123.0;
// 1124.0
double result = Math.Round(source / 2, MidpointRounding.AwayFromZero) * 2;
测试代码:
double[] tests = new double[] {
1.0,
1123.1,
1123.0,
1122.9,
1122.1,
1122.0,
1121.5,
1121.0,
};
string report = string.Join(Environment.NewLine, tests
.Select(item => $"{item,6:F1} -> {Math.Round(item / 2, MidpointRounding.AwayFromZero) * 2}"));
Console.Write(report);
输出结果:
1.0 -> 2
1123.1 -> 1124
1123.0 -> 1124
1122.9 -> 1122
1122.1 -> 1122
1122.0 -> 1122
1121.5 -> 1122
1121.0 -> 1122
2、通过类型转换和取余(%)来实现
using System;
using System.Linq;
public class Program
{
public static void Main()
{
double[] tests = new double[] {
1.0,
1123.1,
1123.0,
1122.9,
1122.1,
1122.0,
1121.5,
};
foreach (var item in tests)
{
Console.WriteLine(item + " -> " + RoundToNearestEven(item));
//Console.WriteLine(item + " -> " + round_up_to_even(item));
}
}
private static long RoundToNearestEven(double value)
{
return (long)value + (long)value % 2;
}
private static int round_up_to_even(double number_to_round)
{
int converted_to_int = Convert.ToInt32(number_to_round);
if (converted_to_int %2 == 0) { return converted_to_int; }
double difference = (converted_to_int + 1) - number_to_round;
if (difference <= 0.5) { return converted_to_int + 1; }
return converted_to_int - 1;
}
}