我用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
中看到不同的打印输出。
比较c
和d
时,精度较低的值,即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/