WebAPI、JSON.Net和丢失小数精度



我在使用WebAPI和JSON.Net时遇到了一个奇怪的问题。当将提交给我的API的JSON去串行化时,我似乎正在失去精度!我将小数提交到小数点后3位,但当这些值在我的对象中出现时,它只有小数点后2位!

我提交的JSON如下:

{
    id: 1,
    name: 'mock data',
    value: 123.456
}

这与一个看起来像这样的类绑定:

public class MockObject {
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Value { get; set; }
}

为了完整起见,这基本上就是我的WebAPI方法的样子:

public HttpResponseMessage Post (MockObject data) {
    // do something with the value here and return the relevant response
}

我通过JQueryajax请求提交数据,但在提交前检查chrome-dev工具中的值时,以及在fiddler中检查值时,我可以看到发布的值与我预期的完全一样。

当使用Post方法中的实体化对象时,"value"的值为123.45。

如果我提交了2位或更少的小数位数(即123.4或123.45),则该值会按预期进行反序列化,但如果我提交的小数位数超过2位(即123.456或123.4567等),则值总是会被反序列化为123.45。

还有人遇到这个问题吗?有什么建议吗?

我设法解决了这个问题。

最终,问题是由于设置了包含货币编号格式的区域性。货币数字格式指定应用于十进制值的小数位数。

为了解决这个问题,我现在将WebApi JSON序列化程序区域设置为Global.ascx.csCultureInfo.InvariantCulture的新实例,如下所示:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Culture = new CultureInfo(string.Empty) {
    NumberFormat = new NumberFormatInfo {
        CurrencyDecimalDigits = 5
    }
};

这意味着十进制值最多可以有5位小数。

相关内容

  • 没有找到相关文章

最新更新