JObject.Parse修改浮点值的结束

Dmi*_*kin 6 json.net

var clientString = "{\"max\":1214.704958677686}";

JObject o = JObject.Parse(clientString);

var jsonString = o.ToString();
Run Code Online (Sandbox Code Playgroud)

jsonString的内容:

{
  "max": 1214.7049586776859
}
Run Code Online (Sandbox Code Playgroud)

这是在可视化对象和执行ToString()时.请注意,686神秘地扩展到6859(精度添加).这对我们来说是一个问题,因为数字不完全相同,以后json上的哈希函数不匹配.

And*_*ker 9

@Ilija Dimov是正确的——JSON.NETdouble默认将 JSON 浮点数解析为s。如果您仍然想使用JObject而不是创建完整的 POCO 进行反序列化,您可以使用 aJsonTextReader并设置FloatParseHandling选项:

var reader = new JsonTextReader(new StringReader(clientString));
reader.FloatParseHandling = FloatParseHandling.Decimal;

JObject obj = JObject.Load(reader);

Console.WriteLine(obj["max"].Value<decimal>()); // 1214.704958677686
Run Code Online (Sandbox Code Playgroud)


Ili*_*mov 5

您的值更改的原因是因为.NET中浮点数的性质.该JObject.Parse(clientString)方法在某一点执行以下行:

double d;
double.TryParse("1214.704958677686", NumberStyles.Float | NumberStyles.AllowThousands, CultureInfo.InvariantCulture, out d);
Run Code Online (Sandbox Code Playgroud)

where d代表你得到的数字JObject.

由于ddouble和double类型是浮点数,因此没有得到您期望的值.阅读有关二进制浮点和.NET的更多信息.

JSON.NET中有一个选项可以将浮点数解析为小数并获得所需的精度,但要做到这一点,您需要创建与json字符串匹配的自定义类并反序列化json.像这样的东西:

public class MyClass
{
    [JsonProperty("max")]
    public decimal Max { get; set; }
}


var obj = JsonConvert.DeserializeObject<MyClass>(clientString, new JsonSerializerSettings
          {
              FloatParseHandling = FloatParseHandling.Decimal
          });
Run Code Online (Sandbox Code Playgroud)

通过使用此代码示例,max不会更改属性的值.