2017-04-17 39 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);