c# - WCF 和数据契约 : Decimal giving 4 digits after the "." and sometimes only 2 digits

标签 c# wcf wcf-binding

我实际上有一个看起来很疯狂的问题,但在 WCF 中我有一个简单的契约(Contract),有时当我的 DataContract 为小数时,服务会在“.”之后发回 4 位数字。其实我期待的只有2位数。有可能吗?

举例:

namespace MyContract.Data
{
    [DataContract]
    public class ClassB : ClassA
    {
        [DataMember]
        public decimal VarA { get; set; }

        [DataMember]
        public decimal VarB { get; set; }
    }
}

调用服务后,我收到的输出如下:

<a:ClassB>
  <a:VarA>47.34</a:VarA>
  <a:VarB>23.1200</a:VarB>
</a:ClassB>

有谁知道为什么会发生这种情况?

最佳答案

发生这种情况是因为 DataContractSerializer 将简单地序列化您的 decimal,因为它们本身想要表示。如果您执行 Console.Write 或其他任何操作而不指定某种格式,您将获得相同的输出。

原因是 23.12 和 23.1200 之间存在(可能)差异,即精度。让我们假设这些值代表您在实验室中进行的一些测量。末尾的额外零意味着您已经足够精确地测量了该值,因此您知道它不是 23.1204 或 23.1211。但另一方面,23.12 的精度较低,可能是使用更不精确的仪器进行相同测量的结果。

现在,这可能与您的特定用例无关。如果您需要精确返回 x 位,您可以在序列化之前对小数点进行四舍五入:

ClassB b = // some initialization
b.VarA = Decimal.Round(b.VarA, x);
b.VarB = Decimal.Round(b.VarB, x);

不过,这会丢弃一些数据,因此如果精度实际上有意义(如上所述),请小心。

如果这仅用于演示目的,请考虑在显示中进行格式化。

关于c# - WCF 和数据契约 : Decimal giving 4 digits after the "." and sometimes only 2 digits,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22856339/

相关文章:

c# - Signalr 客户端 - Xamarin Forms - Connection Hub 不工作 C#

c# - MongoDB C# 驱动程序 - 如何查询子文档数组的属性

c# - Task.Delay 值得取消吗?

c# - WCF "Always generate message contracts"不生成 MessageContract

asp.net - 我们可以在同一个服务(ServiceContract)中为不同的方法(OperationContract)使用 DataContractSerializer 和 XMLFormatSerializer 吗?

c# - Windows 8 上的 Matlab 生成器 NE/MCR

c# - ffmpeginterop.uwp 库给出未注册错误

c# - 在 WCF 上启用 SSL。客户端需要做什么?

.net - net.pipe、net.tcp 与 http 绑定(bind)

wcf - 微调 WCF 绑定(bind)