2010-04-13 47 views
31

我創建了一個在遊戲結束時給出分數的遊戲,但問題是這個分數有時是一個小數點後有很多數字的數字(如87.124563563566 )。我該如何繞過或降低價值,以便能夠擁有像87.12這樣的東西?在C中向上或向下舍入值#

謝謝!

+10

爲什麼會出現在這樣一個問題,這麼大的恩惠? – zxgear 2015-04-13 20:43:41

+5

爲什麼這麼多upvotes答案只有整數,當問題給出了一個例子有兩位小數? – CupawnTae 2015-04-13 21:05:01

+1

@JohnH在過去的一週裏,賞金海報似乎已經成爲一種賞金狂歡。 – OhBeWise 2015-04-15 16:24:45

回答

36

嘗試使用Math.Round。它的各種重載允許你指定你想要的數字,以及你想讓它繞過數字的方式。

+14

你很可能想用'Math.Round(87.123453563566,2,MidpointRounding.AwayFromZero);'。 – 2010-04-13 20:00:36

5
double test2 = 87.2345524523452; 
double test3 = Math.Round(test2, 2); 
84

使用Math.Ceiling(87.124563563566)Math.Floor(87.124563563566)用於總是舍入或向下舍入。我相信這是最接近的整數。

+1

這就是我正在尋找的功能,這些功能與Excel ROUNDUP和ROUNDOWN功能相同。非常感謝! – 2015-04-22 21:46:31

6

你只是想格式化字符串,而不是破壞分數。

3

這個數字對於double類型的變量是正確的,並且在數學上是正確的。
你有兩個很好的解決方案來避免這種情況。

  1. 串解:當你告訴用戶數量,只是做:variable.ToString( 「0.00」)。 ToString只是減少數字。
  2. 舍入解決方案:如果要控制舍入,可以使用Math庫。

你想知道爲什麼你看到這個「怪異」的號碼我,你可以從中讀到:irrational numbers

1

我沒有足夠的信譽來添加註釋,所以我必須要創建一個答案。 但timurid是正確的,只是格式化字符串。

我認爲你正在尋找的東西是:

var myScore = 87.124563563566 
var toShowOnScreen = myScore.ToString("0.00"); 

一些自定義的方式來格式化你的價值觀描述如下: https://msdn.microsoft.com/en-US/library/7x5bacwt(v=vs.80).aspx

0

很多人都提倡使用數學圖書館舍入您的號碼,但即使這可能會導致非常小的舍入誤差。 Math.Round可以,並且有時確實會返回數字,並帶有一些尾隨零和非常小的四捨五入錯誤。這是因爲在內部浮點數和雙精度數仍然以二進制數表示,所以通常很難很清楚地表示某些小的十進制數。

你最好的選擇是,要麼只使用字符串格式化,或者,如果你想它真正圓,將兩者結合起來:

Math.Round(val, 2).ToString("0.00") 
8

要始終向下舍入到小數點後2位:

decimal score = 87.126; 
Math.Floor(score * 100)/100; // 87.12 

要始終四捨五入到小數點後2位:

decimal score = 87.124; 
Math.Ceiling(score * 100)/100; // 87.13