为什么小数位1.00M和1.000000M在C#中有所不同

时间:2014-03-12 13:25:55

标签: c# types decimal rounding primitive-types

我有一个奇怪的问题。我试图将一个十进制变量分配给SAP Web服务。但是我的小数位超过限制时出现错误CX_SY_CONVERSION_LOST_DECIMALS

我使用Math.Round(Decimal, Int32) Method

解决了这个问题

这是我的疑问。

i = 1.23450M;
j = Math.Round(i, 2); // 1.23M

(i!= j)== true,因为该值有差异

i = 1.000000M;
j = Math.Round(i, 2); // 1.00M

我可以将j分配给网络服务中的字段,但不能i。 现在ij之间有什么区别?为什么会这样?

要获得WSDL的参考,请忽略主题。

  <xsd:element name="MyVar" type="tns:curr15.2" />

  <xsd:simpleType name="curr15.2">
    <xsd:restriction base="xsd:decimal">
      <xsd:totalDigits value="15" />
      <xsd:fractionDigits value="2" />
    </xsd:restriction>
  </xsd:simpleType>

1 个答案:

答案 0 :(得分:5)

  

现在i和j有什么区别?

i有6位小数的精度; j只有2.当然,差异根本不会改变数字的幅度 - i == j仍会返回true - 但是decimal会保留小数位数,并且可能是您的网络服务客户端代码通知您指定的内容将超过保留。

来自the documentation

  

缩放因子还会保留十进制数中的任何尾随零。尾随零不会影响算术或比较运算中的十进制数的值。但是,如果应用了适当的格式字符串,ToString方法可能会显示尾随零。

这是.NET中decimalfloat / double之间的重大差异之一。