2015-01-09 2 views
-1

내 이중 숫자가 나머지없이 0.05로 나눌 수 있는지 확인해야합니다. 그래서 나는이 일을 해요 :double이 나머지가없이 나눌 수 있는지 확인하십시오.

if (!double.TryParse(ProductPriceTextBox.Text, out price) || !(0 < price) || !(price%0.05==0.0)) 

문제는 내 ProductPrice 동전에 0.05, 0.1, 0.2, 0.5, 1, 2 유로에서 구성 할 수 있다는 것입니다.

그래서 모든 제품 가격이어야합니다 price%0.05==0를, 즉 :

1유로, 1.5 유로, 0.5 유로 - 1.21 유로, 0.01 유로를 통과 - 실패합니다.

하지만 컴파일러는 나에 대한 프롬프트 항등 연산자와 부동 소수점 숫자의

(price%0.05==0.0) 

비교. 실패 이유

prescision

손실 가능성 내가이 작업을 수행 할 수 있습니다 물론

... 알아낼 수 없습니다 :

int priceInCents= price*100; 
(priceInCents%5==0) 

그러나 나는 다른 방법이 있다고 생각합니다.

+2

부동 소수점 값은 본질적으로 부정확 ..... 그렇게 처리하는 것이 훨씬 쉽다. 반올림 오류가 발생합니다. * [모든 컴퓨터 과학자 이 부동 소수점 연산에 대해 알아야 할 사항] (https://www.ccl.ac.uk/teaching/1011/FPComp/floatingmath.pdf) * – Richard

+4

이 종류의 계산 '==')는 double이나 float을 사용하지 말고 십진수를 사용해야합니다 !! (또는 아마도 엡실론 조건) – TaW

+0

그래서 내가 – Cheese

답변

5

decimal 데이터 유형은 통화에 더 적합하기 때문에 더 잘 사용해야합니다. (double은 부동 소수점 데이터 유형이므로 정확하지 않기 때문에 통화로 재미 있지는 않습니다.)

시험해보기 : 소수점 값;

if (!decimal.TryParse(ProductPriceTextBox.Text, out price) 
    || !(0 < price) 
    || !(price % 0.05M == 0) 
    ) 
+0

십진수를 0.05로 나눌 수 없습니다. 컴파일러 오류 – Cheese

+0

@Cheese : 확인하십시오. '.05'는 부동 소수점 형이므로 컴파일러가 소수점 이하임을 알기 위해서는'M'이 필요하므로'.05M'이 작동합니다. –

-1

곱하기 5

!((price*100) % 5 == 0) 
+1

나는이 질문에 sugessted,하지만 다른 해결책이 아마도 – Cheese

+0

@ TaW "..."라고 생각하고있었습니다. 당신 말이 맞아요.'float'을 사용한 모든 계산은 신뢰할 수 없습니다. –

+0

죄송합니다. 끝까지 읽지 않았습니다. 대신 십진수를 사용해야합니다. decimal price = decimal.Parse (input); ! (가격 % (십진수) .05 == (십진수) 0.0) –

1

전체 숫자 100과 계수와 가격

if ((!double.TryParse(ProductPriceTextBox.Text, out price) 
    || (price * 20.0 != Math.Floor(price * 20.0))) 
    { // failure 
관련 문제