2011-02-22 3 views
1

에 대한 오답하지만이 계산bc 수학은 내가 잘못하고있는 무슨 확실하지 오전 내 계산

bcscale(20); 
echo bcmul(bcdiv('422218', '2388865'), '473'); 

에코 "83.59999999999999999670"하지만 다른 모든 계산기 나에게 83.6를 제공을 줄 것으로 보인다.

해결 방법이 있습니까? 아니면 bcmath의 결함입니까?

+1

이는 해석 된 것으로 보인다. 왜 당신이 원하는 경우 조작을 재정렬하거나 보통의 PHP 부동 소수점 연산을 사용하지 않는 것이 좋을까요? – mario

답변

4

이 결과가 나타나는 이유는 첫 번째으로 나누기 때문입니다.

422218/2388865 
0.17674418604651162790697674418604651163 

하지만 그 0.1767441860465116279가되도록 당신은 20 자리를 요청 :

분할 당신을 제공합니다. 그 관점에서, bc 이제 올바른 결과를 제공한다 :

0.1767441860465116279*473 
83.5999999999999999967 

이 경우에 "용액" 먼저 (당신 "단지"9 개 자리를 제공)을 승산하고 분할을 수행하는 것이다 :

bcscale(20); 
echo bcdiv(bcmul('422218','473'),'2388865'); 
83.60000000000000000000 
+0

예! 속임수없는 적절한 해결책. 고맙습니다! 그리고 지금 나는 내가 가서 내 수학에 닦을 것 같아. :) – Zzzarka

0

BCMath는 정확한 결과를 제공합니다. 다른 번호 "형태"를해야하는 경우를 변경하는 round() 같은 기능을 사용

http://php.net/manual/en/function.round.php

예를 들어 :

echo round(bcmul(bcdiv('422218', '2388865'), '473'), 1); 

당신에게 83.6를 제공 할 것입니다.

+0

정확한 결과는'418/5' 또는'83.6'입니다. – Eelvex

+0

"정확한"결과 란 컴퓨터에 의해 계산 된 정확한 숫자를 말합니다. 누군가는 정밀도가 제한되어 결과도 "제한적"이라고 말했기 때문입니다. –

+0

@ TomaszKowalczyk 내가 뭘 잘못했는지 내가 가장 가능성이 그것을 해결하기 위해 같은 것을 사용하여, 다른 질문에 좋은 bcround() 함수를 발견 [링크] (http://stackoverflow.com/questions/1642614/how -to-ceil-floor-and-round-bcmath-numbers)를 사용하여 숫자의 정밀도를 줄이는 데 사용할 것입니다. – Zzzarka

1

bcmath 함수는 임의의 정밀도 산술을 사용합니다. 계산은 100 % 정확하지 않습니다 - 그들은 당신이 요구하는만큼 정확합니다 (당신은 20 등급을 요구했습니다). 계산이 정확하지 않기 때문에 항상 정확한 답변을 기대할 수는 없습니다.

이 경우 계산기가 올바른 답을 줄 것이라고 말합니다. 그러나 임의의 정밀도 산술 (대다수)을 사용한다고 가정하면 다른 경우에는 잘못된 답을 줄 것입니다. 일부 계산기는 표시 할 수있는 것보다 더 높은 정밀도로 계산하여 부정확성을 숨 깁니다 (예 : 추가 두 자리). 오류가 발생한 곳에서 계산을 수행하면 결국 오류가 표시됩니다.

+0

그래, 그게 아주 의미가있어, 내 피곤 뇌를 똑바로 설정 주셔서 감사합니다! – Zzzarka

0

대부분의 계산기가 수행 할 수있는 것보다 더 정밀도 (20 자리)를 지정했습니다. 따라서 그들은 반올림하여 10 또는 15 자리 숫자로 83.5999 ... 99의 83.6을 얻습니다.

관련 문제