将UInt64转换为在C#中浮动的数据丢失

时间:2015-01-30 17:59:25

标签: c#

我试图在两个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。我在这里缺少什么?

2 个答案:

答案 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。