这里我有一个代码(只是玩游戏)
using System ;
class program{
static void Main(string[] args)
{
float a = 4.246f;
double b = 8.492;
System.Console.WriteLine(a*2);
System.Console.WriteLine(b/a);
}
}
这里的预期结果是2,但它给出了奇迹般的结果。“2.0000000880453”。 (我知道它需要铸造所需的结果)。
但我的问题是代码如何得出这个奇迹结果。如果它们不兼容,那么为什么它没有给出错误
答案 0 :(得分:2)
运行时可以自由地以更高的精度执行浮点运算,然后在赋值时截断(如果需要)。最终,如果你将一个双倍除以一个浮点数,你将得到一个双后卫,除非你专门施放到一个浮点数。这可以通过以下方式确认:
new Number(5) == 5 //logs true because abstract comparison is used. The object is downcast to the primitive type
new Number(5) === 5 //logs false when used with strict comparison that also compares types
new Number(5) == new Number(5) //logs false - type coersion not required, references are not equal
new Number(5) === new Number(5) //logs false - references are not equal
在某些情况下,即使您将具有浮点的操作分配给浮点数,操作仍然可以由运行时以更高的精度执行。在this question中就是这种情况的一个例子。