c# - 为什么比较 float 和 double 时会出现此输出

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

最佳答案

当您进行第一次赋值时,常量将被截断以适合浮点。当您执行第二次赋值时,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 的原因。

关于c# - 为什么比较 float 和 double 时会出现此输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20696395/

相关文章:

c# - 报告/监控长流程进度的设计模式

c# - 是否可以通过 HTML 从 jQuery 中的 C#/Razor 获取数据?

c# - NReco 视频到位图序列

c - scanf 成功但存储的值不适合某些大的 float

SQL ROUND - 算术溢出的实际原因是什么?

c# - .Take(5) 在 ObservableCollection 上返回 0 计数

c++ - 当函数几乎为 "flat"时,牛顿-拉夫森方法不可能实现

java - Array 如何将原始数据类型视为对象?

c - C 中的位、字节、字符和整数大小

java - 将原语的动态列表传递给 Java 方法