Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# JSON以相同的方式序列化两个十进制数_C#_Serialization_Formatting_Json.net - Fatal编程技术网

C# JSON以相同的方式序列化两个十进制数

C# JSON以相同的方式序列化两个十进制数,c#,serialization,formatting,json.net,C#,Serialization,Formatting,Json.net,如何强制NewtonSoft Json序列化程序以相同的方式序列化两个小数 decimal a = 1234.1200M; decimal b = 1234.12M; var sa = JsonConvert.SerializeObject(new { value = a }); var sb = JsonConvert.SerializeObject(new {value = b}); Console.WriteLine(sa); Console.WriteLine(sb); 结果如下:

如何强制NewtonSoft Json序列化程序以相同的方式序列化两个小数

decimal a = 1234.1200M;
decimal b = 1234.12M;

var sa = JsonConvert.SerializeObject(new { value = a });
var sb = JsonConvert.SerializeObject(new {value = b});
Console.WriteLine(sa);
Console.WriteLine(sb);
结果如下: {“值”:1234.1200} {“值”:1234.12}


我如何强制它用4个小数对它们进行序列化,使结果相同?

您可以按如下格式设置小数:

        var sa = JsonConvert.SerializeObject(new { value = a.ToString("#.#000") });
        var sb = JsonConvert.SerializeObject(new { value = b.ToString("#.#000") });
在稍微摆弄了一下序列化程序之后,我找到了一个“答案”:

private class JsonTextWriterOptimized : JsonTextWriter
{
    public JsonTextWriterOptimized(TextWriter textWriter)
        : base(textWriter)
    {
    }
    public override void WriteValue(decimal value)
    {
        // we really really really want the value to be serialized as "0.0000" not "0.00" or "0.0000"!
        value = Math.Round(value, 4);
        // divide first to force the appearance of 4 decimals
        value = Math.Round((((value+0.00001M)/10000)*10000)-0.00001M, 4); 
        base.WriteValue(value);
    }
}
第一轮数学将在第四轮之后删除任何小数。 值+0.00001M完成后,像100这样的数字变为100.00001。然后我们乘和除。所有这些都使小数点保持在4位小数。然后我们四舍五入以确保通过+0.00001添加的第五个小数消失。 这似乎适用于我对其提出的任何价值观

然后使用自定义编写器:

var jsonSerializer = Newtonsoft.Json.JsonSerializer.Create();
var sb = new StringBuilder(256);
var sw = new StringWriter(sb, CultureInfo.InvariantCulture);
using (var jsonWriter = new JsonTextWriterOptimized(sw))
{
    jsonWriter.Formatting = Formatting.None;
    jsonSerializer.Serialize(jsonWriter, instance);
}
我还修正了我自己的答案(我把它忘在了一个类似的问题上):
有点麻烦,删除
M
之前的尾随零。很高兴在这里看到你+1,但这是一个字符串,不是小数点。您的结果将是
{“value”:“1234.1200”}
。此外,如果小数是更复杂对象的一部分,而不仅仅是我在示例中使用的一个简单版本,则这不起作用。如果您想将其视为小数,“1234.1200”和“1234.12”之间没有任何区别。您需要的是字符串表示形式的差异。有人可能会说,你要求它像十进制一样走,像字符串一样嘎嘎。。。