gpt4 book ai didi

c# - WCF 和 DataContract : Decimal giving 4 digits after the "." and sometimes only 2 digits

转载 作者:太空宇宙 更新时间:2023-11-03 10:47:31 25 4
gpt4 key购买 nike

我实际上有一个可能看起来很疯狂的问题,但在 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 和 DataContract : Decimal giving 4 digits after the "." and sometimes only 2 digits,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22856339/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com