2012-04-11 25 views
4

當我嘗試將大數存儲到類似float varr = 123456789;的浮動中時,變量varr的值爲123456792.0而不是123456789.0正如我所料。爲什麼?.NET中的大浮動(單個)數字

有沒有解決方案?

我不能使用雙精度或十進制,因爲我限制在內存中的4個字節。

+0

你可以嘗試像** float var1 = 123456789; ** – sarwar026 2012-04-11 09:13:12

+0

這對你有什麼問題嗎?你可以使用格式化來顯示數值而不需要額外的編號0 – 2012-04-11 09:13:38

+3

@All你們誰都沒有注意到這個值實際上改變了? – 2012-04-11 09:14:12

回答

1

這是因爲float變量的精度有限。使用double來代替。

正如你可以在這裏看到,浮只有7位精度,而雙擁有13: http://msdn.microsoft.com/en-us/library/b1e65aza%28v=vs.80%29.aspx

有四個字節的內存,你可以約表示。 4十億個不同的值,即9位數的十進制數。你必須問自己,你想展示的數字是否適合該範圍。例如。如果您有0到999 999 999的數字要存儲,則四個字節就足夠了。如果你的號碼從1 000 000到1 999 999 999,那麼這也足夠了。在這種情況下,您需要通過減去1 000 000 000來將輸入數字(雙精度)轉換爲整數。讀取該值時,可以執行反算。

該原理可以擴展爲以較低精度顯示其他範圍的數字或更大範圍。但是你必須自己編碼轉換。

1

如果您需要更高精度,您可以使用doubledecimal
無論如何記住浮點數總是近似的。

+0

問題是我被限制在內存中的4個字節 – Almir 2012-04-11 09:35:14

+1

@Almir:你沒有告訴我們...這似乎很重要,因爲它使差異! – Marco 2012-04-11 09:36:17

0

float類型的精度意味着此限制。您可以使用double類型。

float類型在C#符合IEEE 754-2008binary32 format (Single-precision floating-point format)

Wikipedia

的IEEE 754標準規定了binary32爲具有:

  • 符號位:1位
  • 指數寬度:8位
  • 有效數字精度:24(23明確地存儲)

這給出了從6至9顯著十進制數字精度(如果與至多6顯著十進制 小數字符串轉換爲IEEE 754單精度和再轉換回到 顯示小數相同的數字,那麼最後的字符串應該與原來的匹配; ,如果IEEE 754單精度轉換爲十進制字符串 並且至少有9位有效小數,然後轉換回單個,則最終號碼必須與原始號碼匹配。

符號位 決定數字的符號,這也是 有效數字的符號。指數可以是一個從 -128到127(2的補碼)的8位有符號整數或是一個從0到 255的8位無符號整數,這是IEEE 754二進制32定義中公認的偏置形式。 對於這種情況,指數值127代表實際的零。 真實有效位數包括二進制 點右邊的23個小數位和值爲1的隱式前導位(二進制點左邊) ,除非指數存儲爲全零。因此,有效數字的23個小數位出現在存儲器格式中,但總計精度爲24位(相當於log10(224)≈7.225 十進制數字)。

順便說一句,我不明白你的結果。我運行此代碼:

float varr = 123456789; 
Console.WriteLine(varr.ToString("#")); 

和我的輸出是123456800

+0

由於精度爲7位數,所顯示的值取決於很多因素,因此基本上是隨機的。 – 2012-04-11 10:13:19

+0

@KitFisto你確定嗎?!操作系統或CPU之間的實現可能有所不同嗎?這不能是隨機的。 – 2012-04-11 10:22:29

+0

結果取決於硬件(FPU)或Microcode,它與操作系統無關。 – 2012-04-11 11:30:39

0

如果您可以使用整數(int)和32位整數(4字節),則可以存儲該數字,並且不會出現任何精度問題。