我想找到一個數字的增量值。
我試着用這個。我用Abs
函數。它對整個數字工作正常。
但是當我嘗試做以下,使用C#Math.Abs返回值 - 沒有得到預期的輸出
var gh = Math.Abs(3.223 - 6.243);
返回3.0200000000000005
。但我期待3.02
。
爲什麼?如何獲得3.02
?
我想找到一個數字的增量值。
我試着用這個。我用Abs
函數。它對整個數字工作正常。
但是當我嘗試做以下,使用C#Math.Abs返回值 - 沒有得到預期的輸出
var gh = Math.Abs(3.223 - 6.243);
返回3.0200000000000005
。但我期待3.02
。
爲什麼?如何獲得3.02
?
因爲您使用的浮點數/雙精度值本質上不是100%精確(這是由於它們的二進制表示形式)。例如,你甚至不能使用浮點數精確的0.1
,因爲它的二進制表示是週期性的1.(1001)
。這是對此事非常完整的文章:What Every Computer Scientist Should Know About Floating-Point Arithmetic
文藝青年最愛的解決方案是使用decimal
精確十進制運算
var gh = Math.Abs(3.223m - 6.243m);
我收到了正確的價值。嘗試將它轉換爲Decimal
,也許你會得到正確的精度:
decimal gh = Convert.ToDecimal(Math.Abs(3.223 - 6.243));
祝你好運!
這是一個壞主意。不要混合浮點和小數運算。決定使用哪一個並在那裏進行整個計算。 –
你可能會試試這個: var sgh = gh.ToString(「0.00」,CultureInfo.CurrentCulture);
無論3.223
也不6.243
是二進制浮點精確表示。您所需的3.02
的答案也不完全可以代表。
如果你想精確的十進制算術,你應該使用decimal
類型。例如:
var gh = Math.Abs(3.223m - 6.243m);
這將導致gh
之中decimal
類型,並具有你想要的精確值。文字上的m
後綴用於指示decimal
類型的值。
有用的資源
這取決於你要多少位有,如果你想有小數點,然後 變種GH =轉換。 ToDecimal(Math.Abs(3.223-6.243));
這是一個壞主意。不要混合浮點和小數運算。決定使用哪一個並在那裏進行整個計算。 –
你是否需要顯示這樣的數字,或者你想用它進行進一步的計算?
爲了顯示它,你可以使用字符串格式。如果您將其用於進一步計算,則應該像這樣保留並在需要顯示數字的位置應用截斷。
閱讀關於浮點精度的內容http://en.wikipedia.org/wiki/Floating_point – Steve
[每位計算機科學家應該瞭解的浮點算術知識](http://docs.oracle.com/cd/) E19957-01/806-3568/ncg_goldberg.html) – Habib