我想了解浮點不準確以及如何在c#中處理它們。c#和浮點數不準確
我已經看過Floating point inaccuracy examples這給出了一些很好的答案,但我想明確地瞭解它到C#。
使用十進制'8.8',我將如何將其轉換爲二進制表示,然後回到小數,以便該值更改爲'8.8000000000000007'?
我嘗試過使用How to get the IEEE 754 binary representation of a float in C#的建議,但沒有運氣。
我想了解浮點不準確以及如何在c#中處理它們。c#和浮點數不準確
我已經看過Floating point inaccuracy examples這給出了一些很好的答案,但我想明確地瞭解它到C#。
使用十進制'8.8',我將如何將其轉換爲二進制表示,然後回到小數,以便該值更改爲'8.8000000000000007'?
我嘗試過使用How to get the IEEE 754 binary representation of a float in C#的建議,但沒有運氣。
這裏的事情,雖然: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);
可以比較幾種不同的雙打是這樣的:
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):64
和33
給出數字8.8
的符號,幅度和第一(最)有效位。由於8.8
是一個小分母(44/5中的5)的分數,因此餘下的比特反覆重複一段時間就不足爲奇了。爲了得到確切的8.8
,153s將不得不永久繼續。但是double
只有8個字節的空間。因此我們需要輪流。舍入到154
給出最接近的值,因爲下一個「term」(153
)更接近256
而不是0
。因此c
是可能的最精確的表示。
當您查看上述代碼的輸出時,即使我們使用"R"
格式字符串,也會看到c
僅輸出爲8.8
。但是您知道c
位於b
和d
(以及a
和e
之間的一半)之間,因此您可以輕鬆估計「真實」十進制值最接近8.8000000000000007
。
您所期望的數字超出了浮點範圍。的那個外部它是微不足道的8.8轉換爲一個字節數組,回浮動。究竟你有試過嗎? –