在C#(int)十进制和Convert.Int32(十进制)给我两个不同的结果

时间:2010-02-09 12:56:57

标签: c#

我知道存在舍入错误,但任何人都可以解释为什么我使用这些不同的方法得到如此不同的结果:

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

我明白了:

cost = 9990
cost1 = 9000

3 个答案:

答案 0 :(得分:15)

试试(int)(amount*1000)。在Convert中,括号强制执行优先级,但强制转换(int)优先于乘法 - 因此您当前具有:((int)amount)*1000,它在(在转换期间)舍入到9。

特别参见MS规范中的“7.2.1运算符优先级和关联性”,它定义了在乘法之前的强制转换:

  • 7.5:主要:x.y f(x)a [x] x ++ x--新类型的默认选中未经检查的委托
  • 7.6:一元:+ - ! 〜++ x --x(T)x
  • 7.7:乘法:* /%

答案 1 :(得分:3)

第二个应该是

var cost1 = (int)(amount * 1000);

您必须乘以1000,然后转换结果。在您的示例中,您首先转换然后再乘以。

参见 Operator precedence and associativity

答案 2 :(得分:2)

我想知道它是precedence问题吗?试试这个:

(int)(amount*1000);