C# 中的舍入集成

Rounding Integration in C#

我想编写一个代码来支持我使用小数对值进行舍入。 那么,这样的代码要怎么写呢?

Example 1:

(1) var mainValue = 1.2356 , decimals = 3 ===> 1.236
(2) var mainValue = 1.2356 , decimals = 2 ===> 1.24
(3) var mainValue = 1.2356 , decimals = 1 ===> 1.2

Example 2:
(1) var mainValue = 1.3210 , decimals = 3 ===> 1.321
(2) var mainValue = 1.3210 , decimals = 2 ===> 1.32
(3) var mainValue = 1.3210 , decimals = 1 ===> 1.3

Example 3:
(1) var mainValue = 1.0325 , decimals = 3 ===> 1.033
(2) var mainValue = 1.0325 , decimals = 2 ===> 1.03
(3) var mainValue = 1.0325 , decimals = 1 ===> 1.0

Example 4:
(1) var mainValue = 2.3912 , decimals = 3 ===> 2.391
(2) var mainValue = 2.3912 , decimals = 2 ===> 2.39
(3) var mainValue = 2.3912 , decimals = 1 ===> 2.4

Example 5:
(1) var mainValue = 5.4565 , decimals = 3 ===> 5.457
(2) var mainValue = 5.4565 , decimals = 2 ===> 5.46
(3) var mainValue = 5.4565 , decimals = 1 ===> 5.5

我预计您在调用 Math.Round() 时遗漏了 MidpointRounding.AwayFromZero 参数。否则,您会得到奇怪的舍入结果,因为它舍入到最接近的偶数(所谓的 "Banker's Rounding")。

试试这个代码;它给出了您的预期结果:

using System;

namespace Demo
{
    class Program
    {
        static void Main()
        {
            round(1.2356, 3);
            round(1.2356, 2);
            round(1.2356, 1);

            round(1.3210, 3);
            round(1.3210, 2);
            round(1.3210, 1);

            round(1.0325, 3);
            round(1.0325, 2);
            round(1.0325, 1);

            round(2.3912, 3);
            round(2.3912, 2);
            round(2.3912, 1);

            round(5.4565, 3);
            round(5.4565, 2);
            round(5.4565, 1);
        }

        static void round(double value, int decimals)
        {
            double result = Math.Round(value, decimals, MidpointRounding.AwayFromZero);
            Console.WriteLine($"round({value}, {decimals}) = {result}");
        }
    }
}