2013-07-09 3 views
-1

현재 2 개의 double과 1 개의 세금이 제외 된 가격 및 세금 비율이 있습니다.objective-c에 곱하면 예상치 못한 동작이 발생합니다.

가격 : 9.79 (bascially 11 만 세금 별도) 세금 : 11 %

이제 무엇을해야하는지 다시 가격 세금 포함를 얻는 것입니다, 그래서이 수행

// Tax exclusive test 
double taxRate = 0.11; 
double priceWithTax = 11; 
double priceWithoutTax = priceWithTax * (1.0 - taxRate); 

NSLog(@"priceWithoutTax = %f", priceWithoutTax); 

double result = priceWithoutTax * (1 + taxRate); 

NSLog(@"Result: %f", result); 

을 하지만 실행 결과는 다음과 같습니다.

priceWithoutTax = 9.790000 
Result: 10.866900 

예상 출력은 다시 11입니다. 누구든지 멋진 일을 도울 수 있다면 float 정밀도에 관한 많은 소스를 확인했지만 대답을 찾을 수없는 것 같습니다.

미리 감사드립니다.

UPDATE (밧세바 의해 답변을 한 후 새로운 코드)

// Tax exclusive test 
double taxRate = 0.11; 
double priceWithTax = 11; 
double priceWithoutTax = priceWithTax * (1.0 - taxRate); 

NSLog(@"priceWithoutTax = %f", priceWithoutTax); 

double result = priceWithoutTax/(1 - taxRate); 

NSLog(@"Result: %f", result); 

결과 :

priceWithoutTax = 9.790000 
Result: 11.000000 

답변

3

귀하의 수학이 잘못된 : 당신이 double result = priceWithoutTax/(1.0 - taxRate);이 필요합니다.

대략 말하면 부동 소수점 정밀도는 14 번째 유효 숫자 (2 진수)의 오류 만 비난받을 수 있습니다.

+0

지금 시도해보십시오. 시도 할 때 질문이 업데이트됩니다. –

+0

작동합니다! !!!! 감사!! 당신은 오늘 확실히 영웅입니다! –

+0

나는 당신의 대답을 받아 들일 것이지만 나는 8 분 후에 만 ​​... –

3

배수바의 대답이 잘못되었습니다. 그의 결과는 당신에게 일관된 답을 제공하지만 질문은 당신이 세금을 포함하는 가격을 취하려고하고 세금없이 그 항목의 가격을 계산한다고 말합니다. 이를 위해 밧세바의 수학은 정확하지 않습니다.

double result = priceWithoutTax * (1 + taxRate);은 priceWithTax를 계산하는 올바른 방법입니다.

예. 세금 플러스 당신에게 $ 10.50

double priceWithoutTax = priceWithTax * (1.0 - taxRate);의 총 비용은 5 %의 세금을 포함하지 않는 $ 10의 가격으로 제공되는 셔츠 priceWithTax에서 priceWithoutTax을 계산하는 잘못된 공식이다. 같은 예를 10 달러짜리 셔츠와 함께 사용하면이 수식에 연결하면 priceWithoutTax = $10.50 * (1.0 - 0.05) = $9.975이됩니다. 당신은 셔츠가 정확히 세금없이 10 달러를 소비한다는 것을 알고 있기 때문에 잘못된 답을 알고 있습니다. priceWithoutTax를 계산하기

올바른 방법 : 다시 셔츠 double priceWithoutTax = priceWithTax/(1.0 + taxRate);

다시 확인합니다. priceWithoutTax = $10.50/(1.0 + 0.05) = $10

+1

예 동의합니다.내 대답은 예기치 않은 결과를 첫 번째 계산에서 얻은 결과와 조율하고 부동 소수점 비 정밀에 기인 할 수 있다는 아이디어를 기각하는 데 더 많은 것이 었습니다. 초기 계산의 목적에 아무런주의를 기울이지 않았습니다. OP가 정말로하고 싶었던 것에 대한 정보는주의 깊게 선택한 변수 이름과 프로그램 주석 (우리 모두에게 교훈이 될 수 있음)에서 수집 할 수 있습니다. 따라서 +1하고 OP가이 답변을 신중하게 검토 할 것을 제안합니다. – Bathsheba

관련 문제