2009-08-25 153 views
69

我顯示評分以及用於我需要遞增如下:我如何四捨五入到最接近的0.5?

如果數字爲1.0它應該是等於1
如果號碼1.1應該等於1
如果數字爲1.2應該等於1
如果數字爲1.3應等於1.5
如果號碼1.4應等於1.5
如果號碼1.5應等於1.5
如果數字爲1.6應等於1.5
如果數字是1.7應該等於1.5
如果數字爲1.8應等於2.0
如果號碼1.9應等於2.0
如果號碼2.0應等於2.0
如果號碼2.1應等於2.0
等等......

有沒有簡單的方法來計算所需的值?

回答

150

乘以你的等級2,然後繞行Math.Round(rating, MidpointRounding.AwayFromZero),然後通過2

+0

+1這個建議是正確的。 – 2009-08-25 16:40:55

+0

完美地工作!謝謝:) – 2009-08-25 16:45:40

+5

唉,如果只有我輸入更快,大聲笑 – 2009-08-25 16:46:08

49

乘以2除以值,圓形,然後通過2

分,如果你想就近季度,乘以4,除以4等

+4

簡單而完美。這正是我所期待的。謝謝! – Michael 2012-06-01 17:41:36

1
decimal d = // your number.. 

decimal t = d - Math.Floor(d); 
if(t >= 0.3d && t <= 0.7d) 
{ 
    return Math.Floor(d) + 0.5d; 
} 
else if(t>0.7d) 
    return Math.Ceil(d); 
return Math.Floor(d); 
0

有幾種選擇。如果性能是一個問題,請測試它們以查看在大型循環中哪些工作最快。

double Adjust(double input) 
{ 
    double whole = Math.Truncate(input); 
    double remainder = input - whole; 
    if (remainder < 0.3) 
    { 
     remainder = 0; 
    } 
    else if (remainder < 0.8) 
    { 
     remainder = 0.5; 
    } 
    else 
    { 
     remainder = 1; 
    } 
    return whole + remainder; 
} 
+0

這應該起作用,但它不像一些解決方案那樣優雅。乘法和使用系統庫只是性感。 – captncraig 2009-08-25 16:45:25

+0

性能通常更重要,而這最終可能會比乘法和除法解決方案花費更少的時間。 – 2009-08-25 17:57:15

+2

此代碼不正確。由於雙運算通常有一些小的舍入誤差,例如4.8 - 4.0的操作可能會給出例如0.799999 ...。在這種情況下,上面的代碼將四捨五入到4.5。最好還是使用Math.Floor而不是Math.Truncate,因爲現在負數不會相應地舍入。我更喜歡被接受的答案,因爲它更簡單並且不太容易出現執行錯誤。 – Accipitridae 2009-08-25 19:46:02

1

聽起來像你需要舍入到最接近的0.5。我在C#API中看不到round的版本(一個版本需要一些十進制數字才能四捨五入,這是不一樣的)。

假設你只需要處理十分之一的整數,就足以計算出round (num * 2)/2。如果你使用任意精確的小數,它會變得更加棘手。希望你不要。

-1

我對這個問題也有困難。 我的代碼主要在ActionScript 3.0是用於Adobe Flash Platform的基本編碼,但也有simularities的語言:

我想出瞭解決辦法如下:

//Code for Rounding to the nearest 0.05 
var r:Number = Math.random() * 10; // NUMBER - Input Your Number here 
var n:int = r * 10; // INTEGER - Shift Decimal 2 places to right 
var f:int = Math.round(r * 10 - n) * 5;// INTEGER - Test 1 or 0 then convert to 5 
var d:Number = (n + (f/10))/10; // NUMBER - Re-assemble the number 

trace("ORG No: " + r); 
trace("NEW No: " + d); 

那差不多了。 請注意使用'數字'和'整數'以及它們的處理方式。

祝你好運!

9

下面是我寫的幾個方法,它們總是向上或向下舍入到任何值。

public static Double RoundUpToNearest(Double passednumber, Double roundto) 
{ 
    // 105.5 up to nearest 1 = 106 
    // 105.5 up to nearest 10 = 110 
    // 105.5 up to nearest 7 = 112 
    // 105.5 up to nearest 100 = 200 
    // 105.5 up to nearest 0.2 = 105.6 
    // 105.5 up to nearest 0.3 = 105.6 

    //if no rounto then just pass original number back 
    if (roundto == 0) 
    { 
     return passednumber; 
    } 
    else 
    { 
     return Math.Ceiling(passednumber/roundto) * roundto; 
    } 
} 

public static Double RoundDownToNearest(Double passednumber, Double roundto) 
{ 
    // 105.5 down to nearest 1 = 105 
    // 105.5 down to nearest 10 = 100 
    // 105.5 down to nearest 7 = 105 
    // 105.5 down to nearest 100 = 100 
    // 105.5 down to nearest 0.2 = 105.4 
    // 105.5 down to nearest 0.3 = 105.3 

    //if no rounto then just pass original number back 
    if (roundto == 0) 
    { 
     return passednumber; 
    } 
    else 
    { 
     return Math.Floor(passednumber/roundto) * roundto; 
    } 
} 
0

正確的方法來做到這一點是:

public static Decimal GetPrice(Decimal price) 
      { 
       var DecPrice = price/50; 
       var roundedPrice = Math.Round(DecPrice, MidpointRounding.AwayFromZero); 
       var finalPrice = roundedPrice * 50; 

       return finalPrice; 

      } 
0
Public Function Round(ByVal text As TextBox) As Integer 
    Dim r As String = Nothing 
    If text.TextLength > 3 Then 
     Dim Last3 As String = (text.Text.Substring(text.Text.Length - 3)) 
     If Last3.Substring(0, 1) = "." Then 
      Dim dimcalvalue As String = Last3.Substring(Last3.Length - 2) 
      If Val(dimcalvalue) >= 50 Then 
       text.Text = Val(text.Text) - Val(Last3) 
       text.Text = Val(text.Text) + 1 
      ElseIf Val(dimcalvalue) < 50 Then 
       text.Text = Val(text.Text) - Val(Last3) 
      End If 
     End If 
    End If 
    Return r 
End Function 
+4

此代碼看起來不像C#中的問題所需。它有什麼作用?請提供一些解釋,而不是用一種非特定語言的代碼。 – AdrianHHH 2017-01-25 13:45:03