簡體   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