为什么在比较浮点数和双精度时会出现此输出



我用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

所以,问题:
为什么它的输出是真的
请帮我理解这一点,谢谢!

当您执行第一个赋值时,常量将被截断以适合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 .

最新更新