繁体   English   中英

丢失将UInt64转换为C#的数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM