我试图在两个UInt64值上做一些mat并将结果存储在float中:
UInt64 val64 = 18446744073709551615;
UInt64 val64_2 = 18446744073709551000;
float val = (float)val64 - val64_2;
Console.WriteLine(val64);
Console.WriteLine(val.ToString("f"));
Console.ReadKey();
我期待val为615.0,但我得到0.0! 使用double代替val似乎可以工作,但肯定float可以存储615.0。我在这里缺少什么?
答案 0 :(得分:1)
它不是被截断的结果,而是计算中使用的值。您将val64
投射到总和中的float
。这也意味着val64_2
将被强制转换为浮点数(以匹配val64)。两者都失去了足够的精度,当它们作为浮动重新获得时它们是相同的值,差异为0。
您希望将它们保留为UInt64
以进行减法,并将结果作为浮点数。即。
float val = (float)(val64 - val64_2);
答案 1 :(得分:0)
Float是一种近似值,只能存储6或7位有效数字(参见https://msdn.microsoft.com/en-us/library/hd7199ke.aspx)
在您的代码中,当转换为浮动时,两个UInt64最终都为1.84467441E + 19。
正如各位人士已经提到的那样,解决办法是将值保留为减法的UInt64。