C# 我想写的C函数有个奇怪的问题

C# 我想写的C函数有个奇怪的问题,c#,C#,我在写这个函数 const int ProgressBarLength = 230; foreach (TransactionDetail item in list) { var itemProgress = ((ProgressBarLength/item.PurchasesRequired) * Convert.ToInt32(item.TransactionAmount)); item.ProgressBar = ite

我在写这个函数

  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个TransactionDetails

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


我做错了什么?

我猜你应该做一个演员阵容,在某个地方翻一番,以提高你的级别。当一个整数除以一个整数时,不会得到一个双精度的结果

请尝试以下操作:

double itemProgress = ( ((double)ProgressBarLength / item.PurchasesRequired )
                      * Convert.ToInt32( item.TransactionAmount ) );
item.Purchases是否需要整数

如果是这样,您的问题是整数除法

var itemProgress = (double) ProgressBarLength / item.PurchasesRequired * item.TransactionAmount;
ProgressBarLength是一个整数,因此230/500=0


在强制转换或ProgressBarLength中使用float、double或decimal来保持所需的精度级别。

看起来您正在执行整数除法

var itemProgress = (double) ProgressBarLength / item.PurchasesRequired * item.TransactionAmount;
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);
}

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

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

您可以将表达式计算为双精度,也可以先进行乘法运算,这样就不会因为整数除法而丢失相关精度

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