在C#(int)decimal和Convert.Int32(decimal)中,给我两个不同的结果

在C#(int)decimal和Convert.Int32(decimal)中,给我两个不同的结果,c#,C#,我知道存在舍入误差,但有人能解释为什么我使用这些不同的方法得到如此不同的结果: decimal amount = 9.990M; var cost = Convert.ToInt32(amount*1000); var cost1 = (int) amount*1000; 我得到: cost = 9990 cost1 = 9000 试试(整数)(金额*1000)。在“转换”中,括号强制执行优先级,但强制转换(int)优先于乘法-因此您当前有:((int)amount)*1000,它(在强制转

我知道存在舍入误差,但有人能解释为什么我使用这些不同的方法得到如此不同的结果:

decimal amount = 9.990M;
var cost = Convert.ToInt32(amount*1000);
var cost1 = (int) amount*1000;
我得到:

cost = 9990
cost1 = 9000
试试
(整数)(金额*1000)
。在“转换”中,括号强制执行优先级,但强制转换
(int)
优先于乘法-因此您当前有:
((int)amount)*1000
,它(在强制转换期间)四舍五入到9

具体请参见MS规范中的“7.2.1运算符优先级和关联性”,该规范定义了乘法前转换:

  • 7.5:Primary:x.yf(x)a[x]x++x——新类型的默认选中委托
  • 7.6:一元:+-!~++x--x(T)x
  • 7.7:乘法:*/%
    • 我想知道它是否有问题?试试这个:

      (int)(amount*1000);
      

      第二个应该是

      var cost1 = (int)(amount * 1000);
      
      你必须乘以1000,然后转换结果。在您的示例中,先进行转换,然后进行乘法

      请参见