Rounding double values in C#

后端 未结 4 1208
醉话见心
醉话见心 2020-12-05 13:22

I want a rounding method on double values in C#. It needs to be able to round a double value to any rounding precision value. My code on hand looks like:

pub         


        
相关标签:
4条回答
  • 2020-12-05 13:48
    double d = 1.2345;
    
    Math.Round(d, 2);
    

    the code above should do the trick.

    0 讨论(0)
  • 2020-12-05 14:06

    The examples using decimal casting provided in Jimmy's answer don't answer the question, since they do not show how to round a double value to any rounding precision value as requested. I believe the correct answer using decimal casting is the following:

        public static double RoundI(double number, double roundingInterval)
        {
            return (double)((decimal)roundingInterval * Math.Round((decimal)number / (decimal)roundingInterval, MidpointRounding.AwayFromZero));
        }
    

    Because it uses decimal casting, this solution is subject to the casting errors mentioned by Jeppe Stig Nielsen in his comment to Jimmy's answer.

    Also, note that I specified MidpointRounding.AwayFromZero, since that is consistent with the requester's specification that RoundI(1.2345, 0.001) should give 1.235.

    0 讨论(0)
  • 2020-12-05 14:07

    If you actually need to use double just replace it below and it will work but with the usual precision problems of binary floating-point arithmetics.

    There's most certainly a better way to implement the "rounding" (almost a kind of bankers' rounding) than my string juggling below.

    public static decimal RoundI(decimal number, decimal roundingInterval)
    {
       if (roundingInterval == 0) { return 0;}
    
       decimal intv = Math.Abs(roundingInterval);
       decimal modulo = number % intv;
       if ((intv - modulo) == modulo) {
           var temp = (number - modulo).ToString("#.##################");
           if (temp.Length != 0 && temp[temp.Length - 1] % 2 == 0) modulo *= -1;
       }
        else if ((intv - modulo) < modulo)
            modulo = (intv - modulo);
        else
            modulo *= -1;
    
        return number + modulo;
    }
    
    0 讨论(0)
  • 2020-12-05 14:10

    Example of using decimal, as Kibbee pointed out

    double d = 1.275;
    Math.Round(d, 2);          // 1.27
    Math.Round((decimal)d, 2); // 1.28 
    
    0 讨论(0)
提交回复
热议问题