我正在写这个函数。
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 = 500
和TransactionAmount = 199.0
结果值为0.但是,如果item.PurchasesRequired = 5
和TransactionAmount = 94.0
返回有效结果。
我做错了什么?
答案 0 :(得分:7)
item.PurchasesRequired
是int
吗?
如果是这样,你的问题就是整数除法。
ProgressBarLength
是int
,因此230/500 = 0。
使用float
,double
或decimal
(在演员表或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));