2014-01-07 42 views
6

我有一個四捨五入浮點值的問題。 我有一個浮點值設置爲0.8,但在C#代碼它以某種方式0.80000000000000004。如何在c#中舍入float值?

所以我想圓它,所以它成爲0.8。

我曾嘗試:

float roundedFloatvalue = (float)Math.Round((Decimal)floatvalue, 2, MidpointRounding.AwayFromZero); 

和:

float roundedFloatvalue = Truncate(floatvalue, 2); 

public static float Truncate(float value, int digits) 
{ 
    double mult = Math.Pow(10.0, digits); 
    double result = Math.Truncate(mult * value)/mult; 
    return (float)result; 
} 

這似乎只是我不能讓0.80000000000000004是0.8,我不知道爲什麼任何上述不工作的。

+4

你在乎'0.00000000000000004'區別?無論如何,閱讀此:http://floating-point-gui.de/ – Blorgbeard

+0

可能重複的[爲什麼不能十進制數字完全用二進制代表?](http://stackoverflow.com/questions/1089018/why-無法精確的十進制數字被表示爲精確的二進制) – dan04

回答

14

由於0.8在二進制浮點中不可表示,所以不能精確地將0.8表示爲二進制浮點值。有關此主題的必讀內容是What Every Computer Scientist Should Know About Floating-Point Arithmetic

您可以使用decimal來代替使用十進制浮點數的數字,並且可以完全代表0.8。或者您可以選擇繼續使用二進制浮點數,但只顯示小數點後的有限位數。

來獲取值成decimal變量,四捨五入至小數點後兩位,你寫的:

decimal decimalValue = Math.Round((decimal)floatValue, 2); 
+0

thx的解釋,我會讀到關於浮點運算。它幫助我:) – Diemauerdk

3

這是因爲沒有一個float正是 0.8的表示。您可以使用decimal代替十進制浮點類型而不是二進制浮點類型,或者您可以在顯示它時適當地格式化數字。

1

通常情況下,你不計算時需要圓浮點值

0.80000000000000004非常接近0.8

(如0.0〜04顯著爲什麼要使用,不?)

要圍捕值的地方是最終輸出;你可以使用這種情況下格式化

float x = 0.80000000000000004F; 
    Console.Write(x.ToString("G1")); // or "F1" 
+3

它不僅非常接近,它是最接近的IEEE 754雙精度到8./10(嗯,最接近的正好是0.8000000000000000444089209850062616169452667236328125,但都將四捨五入爲相同的雙精度浮點數) –