2014-12-04 13 views
6

當使用Math.Round(doubleValue, 2) // ToEven默認爲什麼在c#2.135總是取整(使用2位小數),以2.13

// 2.135 - > 2.13何樂而不爲2.14?

// 3.135 - > 3.14

而在2.13爲什麼不使用2.14 2.135 AwayFromZero輪什麼時候?

+2

'2.135'實際上是'2.13499999999999999 ....' – leppie 2014-12-04 10:32:14

+3

的確切值(雙)'2.135'爲分數是'1201898150554501/562949953421312'。下一個值是'2.1350000000000016',其中舍入到'2.14'。 – leppie 2014-12-04 10:34:25

+1

@leppie指出,這是一個表示問題,如果您使用'decimal'變量,則舍入值將具有相同的小數部分(對於'2.135m和3.135m') – DrCopyPaste 2014-12-04 10:35:07

回答

5

要從標題回答這樣的問題:

2.135是始終舍(使用2位小數)至2.13,因爲你使用的是二進制浮點數據類型,這只是發生在你的情況。 (由於leppie指出,2.135不能準確地表示爲double,也請注意Microsoft seems to disinguish between decimal and floating point types,即使小數也符合定義)

如果你然而使用decimal數據類型,而不是你將有一致的行爲舍入,可以從this snippet比較不同的輸出來驗證:

decimal val1 = 2.135m; 
decimal val2 = 3.135m; 

Console.WriteLine("decimal val1({0}) rounded = {1}", val1, Math.Round(val1, 2)); 
Console.WriteLine("decimal val2({0}) rounded = {1}", val2, Math.Round(val2, 2)); 

double dval1 = 2.135; 
double dval2 = 3.135; 

Console.WriteLine("double val1({0}) rounded = {1}", dval1, Math.Round(dval1, 2)); 
Console.WriteLine("double val2({0}) rounded = {1}", dval2, Math.Round(dval2, 2)); 
+0

因爲您正在使用*二進制*浮點類型。十進制也是一種浮點類型。 – CodesInChaos 2014-12-04 16:49:14

+0

@CodesInChaos嗯,你的陳述是有道理的,我正要編輯它然後我讀第一句[這裏](http://msdn.microsoft.com/en-us/library/364x0z75.aspx)這讓我想到微軟區分'十進制'和'浮點數據類型'一般來說,也許你有進一步閱讀的另一個參考? – DrCopyPaste 2014-12-04 17:01:22

+0

MSDN可能會因爲喜歡而錯誤標記。但是浮點數有一個通用的定義,小數符合該定義,因爲它有一個可變的指數來縮放。例如,維基百科將浮點描述爲「一般來說,數字大致表示爲固定數量的有效數字(有效數字)並且使用指數縮放」。 – CodesInChaos 2014-12-04 17:17:45

相關問題