我正在尝试写一个C#函数的奇怪问题

时间:2011-02-16 23:08:53

标签: c#

我正在写这个函数。

  const int ProgressBarLength = 230;
  foreach (TransactionDetail item in list)
  {
      var itemProgress =
        ((ProgressBarLength/item.PurchasesRequired) *
        Convert.ToInt32(item.TransactionAmount));

      item.ProgressBar = itemProgress > ProgressBarLength ? ProgressBarLength : itemProgress;
  }

现在我的循环中有2 TransactionDetail

如果item.PurchasesRequired = 500TransactionAmount = 199.0结果值为0.但是,如果item.PurchasesRequired = 5TransactionAmount = 94.0返回有效结果。

我做错了什么?

4 个答案:

答案 0 :(得分:7)

item.PurchasesRequiredint吗?

如果是这样,你的问题就是整数除法。

ProgressBarLengthint,因此230/500 = 0。

使用floatdoubledecimal(在演员表或ProgressBarLength中)来保持所需的精确度。

答案 1 :(得分:3)

我猜你应该做一个强制转换,以便在你的分区中获得更高的精确度。将int除以int时,结果不会得到double。

尝试以下方法:

double itemProgress = ( ((double)ProgressBarLength / item.PurchasesRequired )
                      * Convert.ToInt32( item.TransactionAmount ) );

答案 2 :(得分:2)

看起来你正在执行整数除法。

230/500在整数除法中为零,而230/5为46。

您可以通过将PurchasesRequired投射到double来强制进行浮点除法。正如您所期望的那样,230/500在浮点除法中为0.46。

const int ProgressBarLength = 230;
foreach (TransactionDetail item in list)
{
    var itemProgress = ((ProgressBarLength / (double)item.PurchasesRequired)
                        * Convert.ToInt32(item.TransactionAmount));
    item.ProgressBar = Math.Min((int)itemProgress, ProgressBarLength);
}

答案 3 :(得分:0)

我猜测TransactionDetail.PurchaseRequired是int类型的字段或属性。

ProgressBarLength / item.PurchasesRequired将int除以int,得到int,而不是float。在你的第一个例子中,230/500进行整数除法,结果当然是0。

您可以将表达式计算为double,或者先进行乘法运算,这样就不会失去整数除法的相关精度。

var itemProgress = (double) ProgressBarLength / item.PurchasesRequired * item.TransactionAmount;

var itemProgress = ProgressBarLength * (int) item.TransactionAmount / item.PurchasesRequired));