簡體   English   中英

C#浮點精度

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM