我用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
中看到不同的打印输出。
当您比较c
和d
时,精度较低的值,即 c
,转换为具有更高精度的类型,即double
。这与将1.1111...11F
文本分配给变量 d
时执行的转换相同,因此这些值在==
操作中的比较相同。换句话说,当你这样做时
Console.WriteLine(c == d);
编译器执行以下操作:
Console.WriteLine(((double)c) == d);
这就是为什么比较返回true
.