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 } 

我通过JQuery ajax请求提交数据,但是我可以看到发布的值与我在提交之前检查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位小数。