为什么在比较float和double时输出

时间:2013-12-20 04:39:40

标签: c# double primitive

我在c#中编写了一个程序

        static void Main(string[] args)
    {
        float   c = 1.111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111F;
        double  d = 1.111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111F;
        Console.WriteLine(d);
        Console.WriteLine(c);

        Console.WriteLine(c == d);
        Console.Read();
    }

输出是:

1.11111116409302
1.111111
True

因此,问题:
为什么它的输出是 true
请帮助我理解这一点,谢谢!

1 个答案:

答案 0 :(得分:3)

执行第一次分配时,常量被截断以适合float。执行第二次分配时,float - 精度文字1.1111...11F将转换为double。由于c包含1.1111...11F字面值,因此d的初始化等同于

double d = ((double)c);

两个赋值都会从文字中更改常量的精度,但它们会以不同方式更改它。这就是为什么你在前两个WriteLine中看到不同的打印输出。

比较cd时,精度较低的值(即c)会转换为精度较高的类型,即double。这与您将1.1111...11F字面值分配给变量d时执行的转换的转换方式相同,因此值在==操作中的比较相同。换句话说,当你这样做时

Console.WriteLine(c == d);

编译器执行此操作:

Console.WriteLine(((double)c) == d);

这就是比较返回true

的原因