2017-04-17 44 views
-1

所以我得到一個值對象值使用反射得到,BitConverter給人怪異的結果

var info = item.GetType().GetProperty(p.Key); 
var value = info.GetValue(item); 

value是雙人和等於0,即value.GetType()。名稱爲「雙」和(雙)值== 0真實

但是當我做BitConverter.GetBytes((雙)值),我得到

[0]: 0 
[1]: 0 
[2]: 0 
[3]: 0 
[4]: 0 
[5]: 0 
[6]: 0 
[7]: 128 

128 ???這128個在做什麼?我應該如何得到全0?

+3

IEEE 754浮點數有0兩種表示:+0和-0。你會看到'BitConverter.GetBytes(-0.0)'產生相同的佈局。 – Romoku

+0

@Romoku我看到這是一個答案 – Pikoh

回答

3

什麼是128在這裏做?

對於問題的第一部分:IEEE 754浮點數定義零相等意味着0可以是正數也可以是負數。但是,+0和-0的存儲佈局不同。

我該如何得到所有0,因爲它應該是?

如果代碼將是-0生產值,它需要序列化存儲佈局,以及+0和-0需要進行標準化的話,最好的路線是調用之前檢查的雙重價值BitConverter.GetBytes(double)

How can I test for negative zero?中提到了幾種方法。

在簡單情況下假定0應該是+ 0:

var info = item.GetType().GetProperty(p.Key); 
var value = info.GetValue(item); 
var normalized = (double) value; 

if (normalized == 0.0) 
{ 
    normalized = 0.0; 
} 

var bytes = BitConverter.GetBytes(normalized);