2012-03-15 77 views
1

可能重複:
c# - How do I round a decimal value to 2 decimal places (for output on a page)C#十進制數輪後點休息

如何像點後長期休養返回十進制:

3.786444499963 

本:

3.787 

它不只是砍分,還輪數

+4

你知道這是錯誤的方式來回合,對吧?正確的方法是簡單地查看第四個十進制數字(在這種情況下) – xanatos 2012-03-15 14:13:29

+0

您是否嘗試過我的答案? – 2012-03-15 14:23:33

+0

@xanatos如果你在做銀行家的四捨五入,你需要看第四個數字,如果是5,看第四個數字後是否有非零數字。 – phoog 2012-03-15 14:50:30

回答

4

其餘但是3.786444499963到小數點後三位是3.786普遍接受的舍入。你爲什麼不這樣想?

這樣:

var round = Math.Round(3.786444499963m, 3, MidpointRounding.AwayFromZero); 
Console.WriteLine(round == 3.786m); // prints true 

如果你想讓它總是四捨五入:

var round = Math.Round(3.786444499963m + 0.0005m, 3); 
Console.WriteLine(round == 3.787m); // prints true 

你看我做什麼呢?在使用Math.Round之前,我在輸入中添加了0.0005m。在一般情況下,舍xn小數,

var round = Math.Round(x + 5m * Convert.ToDecimal(Math.Pow(10, -n - 1)), n); 

或者,也許避免了難看double/decimal轉換:

int k = 1; 
decimal value = 5m; 
while(k <= n + 1) { value /= 10m; k++; } 
var round = Math.Round(x + value, n); 

有你需要知道的邊緣情況。 3.786會發生什麼?是應該四捨五入到3.787還是保持在3.786?你還沒有詳細說明你想要的,所以我會留下這個邊緣情況給你。

+0

我需要什麼參考才能獲得Assert? – 2012-03-15 14:22:15

+0

忽略'Assert'。它只是告訴你它會產生所需的行爲。你可以通過Console.WriteLine看到。 – jason 2012-03-15 14:23:25

+0

是的,謝謝。簡單的監督。 – jason 2012-03-15 14:35:48

0
RoundUp(3.786444499963M, 3); 

    static decimal RoundUp(decimal dec, int precision) 
    { 
     decimal rounder = (decimal)(0.5 * Math.Pow(10, -precision)); 
     return Math.Round(dec + rounder, precision); 
    } 
+2

它將返回3.786。 Math.Round不會從最後一位數字開始「級聯」。它只是看數字位置+ 1 – xanatos 2012-03-15 14:12:36

+0

我需要它整理 – 2012-03-15 14:16:34

+0

@ roy.d:有三種主要的方法來回合。例如舍入爲無小數:使用舍入到最接近的整數(0.3 - > 0; 0.7 - > 1);對於Ceil,aproximation始終是最接近的較高整數(0.3 - > 1; 0.7 - > 1),而Floor與aproximation總是最接近的較低整數(0.3 - > 0; 0.7 - > 0)。你需要哪一個? – 2012-03-15 14:47:44

5
Math.Ceiling(3.786444499963 * 1000)/1000; 
+0

謝謝兩位解答作品: Math.Ceiling(3.786444499963 * 1000)/ 1000; and Math.Round(3.786444499963m + 0.0005m,3); – 2012-03-15 14:34:52