2017-04-17 8 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の2つの表現を有します。 '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でなければならないと仮定:+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);