2011-02-16 6 views
0

필자는이 함수를 사용하고 있습니다.이상한 문제가 C# 함수로 작성하려고 시도 중입니다.

이제 내 루프에는 2 TransactionDetail이 있습니다.

item.PurchasesRequired = 500TransactionAmount = 199.0의 경우 결과 값은 0입니다. 그러나 item.PurchasesRequired = 5TransactionAmount = 94.0 인 경우 유효한 결과를 반환합니다.

내가 뭘 잘못하고 있니?

답변

2

정수 나누기를 수행하는 것처럼 보입니다. 5분의 230 당신은 doublePurchasesRequired에 캐스팅하여 부동 소수점 나눗셈을 강제 46

반면

500분의 230는 정수 나눗셈에서 제로이다. 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

당신은 당신의 부서에서 더 정밀도를 얻기 위해 어딘가에 두 배로 캐스팅해야한다고 생각합니다. int를 int로 나눌 때 결과가 double이되지 않습니다.

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

item.PurchasesRequiredint인가 :

는 다음과 같은 시도?

그렇다면 정수 분리입니다.

ProgressBarLengthint, 그래서 500분의 230 = 0

사용 float, double, 또는 decimal (캐스트에서 또는 ProgressBarLength에 대한 중 하나)의 정밀도 원하는 수준을 유지 할 수 있습니다.

0

추측하겠습니다. TransactionDetail.PurchaseRequired는 int 유형의 필드 또는 속성입니다.

ProgressBarLength/item.PurchasesRequired는 in을 int로 나눕니다. 결과는 float가 아닌 int가됩니다. 첫 번째 예제에서 230/500은 정수 나누기이며 결과는 물론 0입니다.

식을 double로 계산하거나 곱셈을 먼저 수행하여 관련 정밀도를 잃지 않도록합니다. 정수부.

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

또는

물론
var itemProgress = ProgressBarLength * (int) item.TransactionAmount/item.PurchasesRequired)); 
+0

! 나는 그 일요일이나 그 무언가를 생각하고 있어야합니다. 고맙습니다 –

관련 문제