C#浮点精度

时间:2014-02-10 21:05:51

标签: c# .net floating-point floating-point-precision floating-point-conversion

任何人都可以向我解释这里发生了什么:

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})

1000000.123f将以f存储为1000000.125(IEEE754近似为32位?)

双倍也将存储1000000.125(即使f似乎不包含我的预期,似乎也会发生)

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

任何人都可以告诉我在输出f?

时输入1000000.13我做错了什么

1 个答案:

答案 0 :(得分: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位数表示。这是不正确的。