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

Sen*_*cob 1 c# types decimal rounding primitive-types

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

我通过使用Math.Round(Decimal,Int32)方法解决了它


这是我的疑问.

i = 1.23450M;
j = Math.Round(i, 2); // 1.23M
Run Code Online (Sandbox Code Playgroud)

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

i = 1.000000M;
j = Math.Round(i, 2); // 1.00M
Run Code Online (Sandbox Code Playgroud)

我可以j在Web服务中分配给该字段,但不能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>
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

现在i和j有什么区别?

i有6位小数的精度; j只有2.当然,差异根本不会改变数字的大小 - 并且i == j仍将返回true- 但decimal保留小数位数,并且可能是您的Web服务客户端代码注意到您指定的数量超过了保存.

文档:

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

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