5

谁能请向我解释这里发生了什么:C#float精度

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有一个潜在的浮动类型(似乎发生[观察手表w indow它的类型为对象{}浮动)

这1000000.123f会被存储f中为1000000.125(IEEE754的近似在32位?)

,双将存储1000000.125以及(似乎发生即使f似乎并不包含我所期望的)

在ToString上要求往返格式会使我在两种情况下返回1000000.125。

任何人都可以告诉我什么我做错了,以获得1000000.13时,串出f?

回答

5

正如您已经观察到的,数字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位精确表示。这是不正确的。

+0

感谢您的答案(和抬头重新:我的转换nop)。有没有float.ToString()不是四舍五入的数字?截断会不会导致1000000.12? –

+0

@StephenEmm:当它在两个表示之间的中间位置时,它会向上(或远离零 - 不确定哪一个 - 但对于正数没有区别)。 –