2012-10-15 57 views
0

我想了解浮點不準確以及如何在c#中處理它們。c#和浮點數不準確

我已經看過Floating point inaccuracy examples這給出了一些很好的答案,但我想明確地瞭解它到C#。

使用十進制'8.8',我將如何將其轉換爲二進制表示,然後回到小數,以便該值更改爲'8.8000000000000007'?

我嘗試過使用How to get the IEEE 754 binary representation of a float in C#的建議,但沒有運氣。

+0

您所期望的數字超出了浮點範圍。的那個外部它是微不足道的8.8轉換爲一個字節數組,回浮動。究竟你有試過嗎? –

回答

3

這裏的事情,雖然:8.8000000000000007不能double精確表示,無論是。最接近的值是8.800000000000000710542735760100185871124267578125(我從Jon Skeet的DoubleConverter得到)。然後,您可以使用Decimal.Parse該字符串得到的8.80000000000000071054273576十進制值。

decimal d = 8.8M; 
double dbl = (double)d; 
string s = DoubleConverter.ToExactString(dbl); 
decimal dnew = decimal.Parse(s); 
0

可以比較幾種不同的雙打是這樣的:

double a = BitConverter.ToDouble(new byte[] { 156, 153, 153, 153, 153, 153, 33, 64, }, 0); 
double b = BitConverter.ToDouble(new byte[] { 155, 153, 153, 153, 153, 153, 33, 64, }, 0); 
double c = BitConverter.ToDouble(new byte[] { 154, 153, 153, 153, 153, 153, 33, 64, }, 0); 
double d = BitConverter.ToDouble(new byte[] { 153, 153, 153, 153, 153, 153, 33, 64, }, 0); 
double e = BitConverter.ToDouble(new byte[] { 152, 153, 153, 153, 153, 153, 33, 64, }, 0); 
Console.WriteLine(a.ToString("R")); 
Console.WriteLine(b.ToString("R")); 
Console.WriteLine(c.ToString("R")); 
Console.WriteLine(d.ToString("R")); 
Console.WriteLine(e.ToString("R")); 

使用format string"R"顯示多餘的數字,但只有在必要時其他表示的System.Double區分。

加法(explanation of the bytes):6433給出數字8.8的符號,幅度和第一(最)有效位。由於8.8是一個小分母(44/5中的5)的分數,因此餘下的比特反覆重複一段時間就不足爲奇了。爲了得到確切的8.8,153s將不得不永久繼續。但是double只有8個字節的空間。因此我們需要輪流。舍入到154給出最接近的值,因爲下一個「term」(153)更接近256而不是0。因此c是可能的最精確的表示。

當您查看上述代碼的輸出時,即使我們使用"R"格式字符串,也會看到c僅輸出爲8.8。但是您知道c位於bd(以及ae之間的一半)之間,因此您可以輕鬆估計「真實」十進制值最接近8.8000000000000007