當我嘗試將大數存儲到類似float varr = 123456789;
的浮動中時,變量varr
的值爲123456792.0
而不是123456789.0
正如我所料。爲什麼?.NET中的大浮動(單個)數字
有沒有解決方案?
我不能使用雙精度或十進制,因爲我限制在內存中的4個字節。
當我嘗試將大數存儲到類似float varr = 123456789;
的浮動中時,變量varr
的值爲123456792.0
而不是123456789.0
正如我所料。爲什麼?.NET中的大浮動(單個)數字
有沒有解決方案?
我不能使用雙精度或十進制,因爲我限制在內存中的4個字節。
這是因爲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來將輸入數字(雙精度)轉換爲整數。讀取該值時,可以執行反算。
該原理可以擴展爲以較低精度顯示其他範圍的數字或更大範圍。但是你必須自己編碼轉換。
float
類型的精度意味着此限制。您可以使用double
類型。
float
類型在C#符合IEEE 754-2008binary32 format (Single-precision floating-point format)
的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
。
由於精度爲7位數,所顯示的值取決於很多因素,因此基本上是隨機的。 – 2012-04-11 10:13:19
@KitFisto你確定嗎?!操作系統或CPU之間的實現可能有所不同嗎?這不能是隨機的。 – 2012-04-11 10:22:29
結果取決於硬件(FPU)或Microcode,它與操作系統無關。 – 2012-04-11 11:30:39
如果您可以使用整數(int
)和32位整數(4字節),則可以存儲該數字,並且不會出現任何精度問題。
你可以嘗試像** float var1 = 123456789; ** – sarwar026 2012-04-11 09:13:12
這對你有什麼問題嗎?你可以使用格式化來顯示數值而不需要額外的編號0 – 2012-04-11 09:13:38
@All你們誰都沒有注意到這個值實際上改變了? – 2012-04-11 09:14:12