7

谁能向我解释这里发生了什么:

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 将作为 1000000.125 存储在 f 中(32 位的 IEEE754 近似值?)

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

在这两种情况下,要求 ToString 上的往返格式都会给我 1000000.125。

谁能告诉我在串出 f 时我做错了什么得到 1000000.13?

4

1 回答 1

6

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

于 2014-02-10T21:33:25.537 回答