[英]Loss of data converting a UInt64 to float in C#
我试图在两个UInt64值上做一些垫子,并将结果存储在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。 我在这里想念什么?
被截断的不是结果,而是计算中使用的值。 您将val64
强制val64
为总和的float
。 这也意味着val64_2
将被val64_2
转换为浮点数(以匹配val64)。 两者都失去了足够的精度,以至于当重新浮点数时,它们都具有相同的值,并且差值为0。
您希望将它们保留为UInt64
进行减法,并将结果作为浮点数。 即
float val = (float)(val64 - val64_2);
浮点数是一种近似值,只能存储6或7个有效数字(请参阅https://msdn.microsoft.com/zh-cn/library/hd7199ke.aspx )
在您的代码中,两个UInt64强制转换为float时都以1.84467441E + 19结尾。
正如许多人已经提到的,解决方案是将值保留为UInt64进行减法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.