WCF和DataContract:在"。"之后给出4位数的十进制数。有时只有2位数

时间:2014-04-04 07:30:50

标签: c# wcf wcf-binding

我实际上有一个可能看起来很疯狂的问题,但是在WCF中我有一个简单的合同,有时当我在小数点上有DataContract时,服务会在"之后发回4位数。&#34 ;。我实际上期待只有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>

有谁知道为什么会这样?

1 个答案:

答案 0 :(得分:2)

之所以发生这种情况,是因为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);

这会抛弃一些数据,所以如果精度实际上有意义,请小心(如上所述)。

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