我在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
请帮助我理解这一点,谢谢!
答案 0 :(得分:3)
执行第一次分配时,常量被截断以适合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
。