2014-03-06 51 views
3

我正在試驗Math.Round這個課程,並且我很難讓它做我想做的事情。基本上,我有以下代碼:有沒有辦法總是使用Math.Round將.5向下取整而不是向上取整?

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迫使它四捨五入到最接近的偶數(0.005 - > .000)?

+0

0.1 * *是偶數,所以0.005將磨圓.01 – Cilan

+0

我怎麼會得到1.675圓到1.67那麼? – user1806716

+0

您可能需要使用Math.Floor –

回答

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

這將符合您的要求。有什麼更具體的?

+0

那麼,我將處理的最終應用程序不只是一個雙。這個解決方案可以工作在1.675,但是對於5.41875這樣的雙工來說,它可以達到5.41而不是像5.42那樣。基本上我只是希望當它有五個(.15,.015等)時總是減小。 – user1806716

+0

在這種情況下,你會自動舍入 – jdphenix

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

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
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); 
      } 
     } 
    } 
} 
相關問題