2012-12-18 110 views
1

我想找到一個數字的增量值。
我試着用這個。我用Abs函數。它對整個數字工作正常。
但是當我嘗試做以下,使用C#Math.Abs​​返回值 - 沒有得到預期的輸出

var gh = Math.Abs(3.223 - 6.243); 

返回3.0200000000000005。但我期待3.02
爲什麼?如何獲得3.02

+2

閱讀關於浮點精度的內容http://en.wikipedia.org/wiki/Floating_point – Steve

+2

[每位計算機科學家應該瞭解的浮點算術知識](http://docs.oracle.com/cd/) E19957-01/806-3568/ncg_goldberg.html) – Habib

回答

6

因爲您使用的浮點數/雙精度值本質上不是100%精確(這是由於它們的二進制表示形式)。例如,你甚至不能使用浮點數精確的0.1,因爲它的二進制表示是週期性的1.(1001)。這是對此事非常完整的文章:What Every Computer Scientist Should Know About Floating-Point Arithmetic

文藝青年最愛的解決方案是使用decimal精確十進制運算

var gh = Math.Abs(3.223m - 6.243m); 
1

我收到了正確的價值。嘗試將它轉換爲Decimal,也許你會得到正確的精度:

decimal gh = Convert.ToDecimal(Math.Abs(3.223 - 6.243)); 

祝你好運!

+0

這是一個壞主意。不要混合浮點和小數運算。決定使用哪一個並在那裏進行整個計算。 –

1

你可能會試試這個: var sgh = gh.ToString(「0.00」,CultureInfo.CurrentCulture);

3

無論3.223也不6.243是二進制浮點精確表示。您所需的3.02的答案也不完全可以代表。

如果你想精確的十進制算術,你應該使用decimal類型。例如:

var gh = Math.Abs(3.223m - 6.243m); 

這將導致gh之中decimal類型,並具有你想要的精確值。文字上的m後綴用於指示decimal類型的值。

有用的資源

1

這取決於你要多少位有,如果你想有小數點,然後 變種GH =轉換。 ToDecimal(Math.Abs​​(3.223-6.243));

+1

這是一個壞主意。不要混合浮點和小數運算。決定使用哪一個並在那裏進行整個計算。 –

2

你是否需要顯示這樣的數字,或者你想用它進行進一步的計算?

爲了顯示它,你可以使用字符串格式。如果您將其用於進一步計算,則應該像這樣保留並在需要顯示數字的位置應用截斷。