[英]C# float precision
誰能給我解釋一下這是怎么回事:
using System;
using System.Text;
namespace ConsoleApplication1 {
class Program {
static void Main(string[] args) {
object o = 1000000.123f;
float f= Convert.ToSingle(o);
double d = Convert.ToDouble(f);
Console.WriteLine(f.ToString("r"));
Console.WriteLine(d.ToString("r"));
Console.ReadLine();
}
}
}
哪個輸出:
1000000.13
1000000.125
我期望:
對象o具有基本的float類型(似乎[從觀察作為對象{float}鍵入的監視窗口發生)
那個1000000.123f將會以1000000.125的形式存儲在f中(32位的IEEE754近似值?)
該double也會存儲1000000.125(即使f似乎不包含我的預期值,似乎也會發生)
在兩種情況下,要求在ToString上使用往返格式將給我1000000.125。
誰能告訴我我在做錯什么才能在排除f時得到1000000.13?
如您所見,數字1000000.123被存儲為1000000.125。 它由double.ToString()
呈現,但由於float.ToString()
被截斷,因為顯示太多數字會產生誤導。
順便說一句,沒有Convert.ToSingle(float)
因為它只會返回您傳入的內容。您的代碼實際上是在解析為Convert.ToSingle(double)
。 因此,您(隱式)轉換為double
,然后(顯式)轉換為float
,從本質上講這是一個空操作。
注意:不要相信JavaScript浮點計算器。 他們中有些人斷言1000000.123由單精度浮點數存儲為1000000.1,我猜這是基於這樣一個假設,因為IEEE浮點數的精度大約為7.22位,因此它們可以精確地用8位數字表示。 這是不正確的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.