2012-03-27 18 views
5

我是C#的初學者,我正在使用浮點數。我需要在這兩個數字之間做減法,但它不起作用。我知道它是由浮點數引起的,但是我怎樣才能解決它,如果你是如此的優秀,你能解釋我爲什麼會發生?提前致謝。C#錯誤的減法? 12.345 - 12 = 0.345000000000001

+0

你想要什麼,你的問題是什麼,請詳細說明你的問題..? – 2012-03-27 13:30:07

+3

請發佈您的代碼。所有的變量都是浮動的嗎? – c0d3Junk13 2012-03-27 13:30:12

+4

你可以發佈代碼嗎?主題中的計算看起來很奇怪。正常的浮點舍入不會導致這種行爲。 – CodesInChaos 2012-03-27 13:30:16

回答

7

考慮使用十進制而不是浮動:

// Instead of this... 
float a = 12.345F; 
float b = 12; 
float c = a - b; 

// Use this: 
decimal d = 12.345M; 
decimal e = 12; 
decimal f = d - e; 

喬恩斯基特給出的這個答案兩種類型之間的區別了很好的解釋:https://stackoverflow.com/a/618596/446681

+0

+1:如果您需要任何種類的數字保真度,「十進制」是要走的路。 – code4life 2012-03-27 14:00:24

+0

小數是我在找的東西,非常感謝。我也想向那些解釋爲什麼會發生的人們致謝。 – c0ntrol 2012-03-27 15:11:57

+0

取決於數字的用途。你應該總是使用'小數'來賺錢。但*不*用於物理模擬。 – dan04 2012-03-27 18:48:07

3

你究竟如何計算?

 float a = 12.35F; 
     float b = 12.0F; 
     float ans = a - b; //0.350000381 

     double x = 12.35; 
     double y = 12.0; 
     double ans2 = x - y; //0.34999999999999964 

     decimal n = 12.35m; 
     decimal m = 12.0m; 
     decimal ans3 = n - m; //0.35 

對我來說這些計算給出了正確的結果。

+0

Thanks for decimal 。 – c0ntrol 2012-03-27 15:13:20

0

根據什麼你,你可以使用十進制類型,或按原樣存儲,但在顯示答案前輪一圈

1

請記住,浮點的行爲可能因您使用的處理器而異。

Here是在這個論壇上與這個主題

如果你真的想挖入主題涉及的問題,here是如何檢查浮點

5

這種行爲的良好來源不是ac#的問題,這是一個計算機科學問題。如果你想真正理解發生了什麼,請閱讀What Every Computer Scientist Should Know About Floating-Point Arithmetic。如果你只關心你爲什麼會遇到問題,那是因爲Float和Double在這個平臺上分別只能精確到7位和15位,並且你需要應用舍入邏輯來實現你正在尋找的結果。

Float C# reference

Double C# reference

擠壓無限多的實數成有限數目的比特 的要求的近似表示。雖然無限多個整數,但在大多數程序中,整數計算的結果可以以32位存儲。相比之下,給定任意固定位數,大多數使用實數的計算將產生不能使用那麼多位精確表示的數量。因此,浮點計算的結果必須經常按照 的順序進行四捨五入以適應其有限表示。該四捨五入錯誤是浮點計算的特徵 。 Goldberg 1991

+0

感謝您的解釋。 – c0ntrol 2012-03-27 15:12:22

相關問題