2016-08-11 105 views
1

なぜ小数点は丸められますが、小数点以下は丸められませんか?Json.NET小数分析の丸め

JsonConvert.DefaultSettings =() => new JsonSerializerSettings 
{ 
    FloatParseHandling = FloatParseHandling.Decimal, 
    Culture = new CultureInfo(string.Empty) 
    { 
     NumberFormat = new NumberFormatInfo 
     { 
      CurrencyDecimalDigits = 5 
     } 
    } 
};  

string jsonData = "{\"Values\": [0.0,22493194440943108.0]}"; 
JObject jObject = JObject.Parse(jsonData); 
decimal[] arrayOfDecimals = JsonConvert.DeserializeObject<decimal[]>(jObject["Values"].ToString()); 
decimal singleDecimal = JsonConvert.DeserializeObject<decimal>(jObject["Values"][1].ToString()); 

Console.WriteLine(JsonConvert.DeserializeObject<decimal[]>(jObject["Values"].ToString())[1]); 
Console.WriteLine(JsonConvert.DeserializeObject<decimal>(jObject["Values"][1].ToString())); 

出力は次のとおりです。

22493194440943108.0

答えて

0

あなたがToString()メソッドを呼び出すと、Json.NETは、それが含まれている値の書式設定された文字列を作成します。それはjObject["Values"].ToString()するための手段と、あなたが得る:

 
2.24931944409431E+16 

は、これらの作品をDeserialisingていますが、単数1のフォーマットは、いくつかの丸めをもたらしていることがわかります。

 
[ 
    0.0, 
    22493194440943108.0 
] 

そしてjObject["Values"][1].ToString()のために、あなたが得ます。あなたが本当にToStringを呼びたいならば、あなたはすでに(JObject.Parseを使用して)直列化復元しました何かをdeserialise、あなたはFormatting.Noneオプションを渡すことができます - これは期待通りに動作します:

decimal[] arrayOfDecimals = JsonConvert.DeserializeObject<decimal[]>(jObject["Values"].ToString(Newtonsoft.Json.Formatting.None)); 
decimal singleDecimal = JsonConvert.DeserializeObject<decimal>(jObject["Values"][1].ToString(Newtonsoft.Json.Formatting.None)); 
関連する問題