【问题标题】:Why is this output when compare a float and a double [duplicate]为什么比较浮点数和双精度时会出现此输出[重复]
【发布时间】:2014-01-08 21:20:22
【问题描述】:

我用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
请帮助我理解这一点,谢谢!

【问题讨论】:

标签: c# double primitive


【解决方案1】:

当您进行第一次赋值时,常量被截断以适应float。当您进行第二次赋值时,float-precision 文字 1.1111...11F 将转换为 double。由于c 包含1.1111...11F 字面量的值,所以d 的初始化等价于

double d = ((double)c);

这两个赋值都改变了常量的精度,但它们的改变方式不同。这就是为什么您会在前两个WriteLines 中看到不同的打印输出。

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

Console.WriteLine(c == d);

编译器会这样做:

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

这就是比较返回true的原因。

【讨论】:

  • 感谢您帮助我了解编译器的工作原理
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
相关资源
最近更新 更多