有没有办法总是使用Math.Round来降低.5而不是使用Math.Round?

时间:2014-03-06 01:10:38

标签: c# math rounding

我正在尝试使用Math.Round课程,但我遇到了让它按照我的意愿去做的问题。基本上我有以下代码:

double test = 1.675;
double rounded = (double)Math.Round((decimal)test, 2, MidpointRounding.ToEven);
Console.Write(rounded);
Console.ReadKey();

我希望rounded为1.67,其中1.675向下舍入为1.67。相反,我当前的输出是:

  

1.68

我认为MidpointRounding.ToEven强迫它舍入到最近的偶数(.005 - > .000)?

4 个答案:

答案 0 :(得分:1)

  double test = 1.675;
  double rounded = Math.Floor(test * 100) / 100;
  Console.WriteLine(rounded);

这符合您的要求。还有什么更具体的吗?

答案 1 :(得分:1)

  

我认为MidpointRounding.ToEven强迫它舍入到最近的偶数(.005 - > .000)?

你错了。 MidpointRounding.ToEven意味着它将以结果的最后一位数为偶数的方式对您的数字进行舍入。

此处记录了这些内容:http://msdn.microsoft.com/de-de/library/system.midpointrounding(v=vs.110).aspx

这应该解决“为什么这样做”的部分。对于“怎么做,我想要什么”:

使用“AwayFromZero”模式,如果您的值高于零,则减去0.01。 (另见:https://stackoverflow.com/a/5166050/1974021

答案 2 :(得分:1)

这应该提供所需的舍入结果:

var test = 1.6765;
var roundToDigits = 2;

var multiplier = Math.Pow(10, roundToDigits);

var roundedValue
    = Equals((test * multiplier) - (int)(test * multiplier), .5)
          ? Math.Floor(test * multiplier) / multiplier
          : Math.Round(test, roundToDigits, MidpointRounding.AwayFromZero);

结果:

  • 1.6765舍入为2位数会返回1.68
  • 1.6765舍入为3位数会返回1.676

答案 3 :(得分:0)

我现在无所事事,所以为了好玩,我做到了这一点......

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine((1.675).CustomRound(2));
            Console.WriteLine((5.41875).CustomRound(2));

            Console.WriteLine((1.67501).CustomRound(2));
            Console.WriteLine((1.67499).CustomRound(2));
            Console.ReadKey();
        }

    }

    public static class fun
    {
        //i looked at math.round with ilspy, they do something like this :-p
        private static readonly double[] pow;

        static fun()
        {
            int max = 16;
            pow = new double[max];

            for (int i = 0; i < max; ++i)
                pow[i] = Math.Pow(10, i);
        }

        public static double CustomRound(this double test, int digits)
        {
            //this seem to be working! :-D
            var fun = test * pow[digits+1];
            var stuff = Math.Floor(test * pow[digits]) * pow[1];
            if ((fun-stuff) == 5)
            {
                return stuff / pow[digits + 1];
            }
            else
            {
                return Math.Round(test, digits, MidpointRounding.AwayFromZero);
            }
        }
    }
}