Formatting a double to two decimal places

前端 未结 7 555
庸人自扰
庸人自扰 2020-11-27 06:25

I have been trying to make the answer this prints out to be to two decimal places. All the math involved has to stay at that format of two decimal places. I have tried a few

相关标签:
7条回答
  • 2020-11-27 06:57
        double d =  3.1493745;
        string s = $"{d:0.00}"; // or $"{d:#.##}"
        Console.WriteLine(s); // Displays 3.15
    
    0 讨论(0)
  • 2020-11-27 07:01

    Well, depending on your needs you can choose any of the following. Out put is written against each method

    You can choose the one you need

    This will round

    decimal d = 2.5789m;
    Console.WriteLine(d.ToString("#.##")); // 2.58
    

    This will ensure that 2 decimal places are written.

    d = 2.5m;
    Console.WriteLine(d.ToString("F")); //2.50
    

    if you want to write commas you can use this

    d=23545789.5432m;
    Console.WriteLine(d.ToString("n2")); //23,545,789.54
    

    if you want to return the rounded of decimal value you can do this

    d = 2.578m;
    d = decimal.Round(d, 2, MidpointRounding.AwayFromZero); //2.58
    
    0 讨论(0)
  • 2020-11-27 07:04

    I would recomment the Fixed-Point ("F") format specifier (as mentioned by Ehsan). See the Standard Numeric Format Strings.

    With this option you can even have a configurable number of decimal places:

    public string ValueAsString(double value, int decimalPlaces)
    {
        return value.ToString($"F{decimalPlaces}");
    }
    
    0 讨论(0)
  • 2020-11-27 07:05

    You can round a double to two decimal places like this:

    double c;
    c = Math.Round(c, 2);
    

    But beware rounding will eventually bite you, so use it with caution.

    Instead use the decimal data type.

    0 讨论(0)
  • 2020-11-27 07:07

    The problem is that when you are doing additions and multiplications of numbers all with two decimal places, you expect there will be no rounding errors, but remember the internal representation of double is in base 2, not in base 10 ! So a number like 0.1 in base 10 may be in base 2 : 0.101010101010110011... with an infinite number of decimals (the value stored in the double will be a number N with :

     0.1-Math.Pow(2,-64) < N < 0.1+Math.Pow(2,-64) 
    

    As a consequence an operation like 12.3 + 0.1 may be not the same exact 64 bits double value as 12.4 (or 12.456 * 10 may be not the same as 124.56) because of rounding errors. For example if you store in a Database the result of 12.3 +0.1 into a table/column field of type double precision number and then SELECT WHERE xx=12.4 you may realize that you stored a number that is not exactly 12.4 and the Sql select will not return the record; So if you cannot use the decimal datatype (which has internal representation in base 10) and must use the 'double' datatype, you have to do some normalization after each addition or multiplication :

    double freqMHz= freqkHz.MulRound(0.001); // freqkHz*0.001
    double amountEuro= amountEuro.AddRound(delta); // amountEuro+delta
    
    
        public static double AddRound(this double d,double val)
        {
            return double.Parse(string.Format("{0:g14}", d+val));
        }
        public static double MulRound(this double d,double val)
        {
            return double.Parse(string.Format("{0:g14}", d*val));
        }
    
    0 讨论(0)
  • 2020-11-27 07:13

    Since you are working in currency why not simply do this:

    Console.Writeline("Earnings this week: {0:c}", answer);
    

    This will format answer as currency, so on my machine (UK) it will come out as:

    Earnings this week: £209.00

    0 讨论(0)
提交回复
热议问题