2016-07-05 7 views
1

PHP에서 간단한 덧셈/뺄셈을 수행하고 잘못된 결과를 반환합니다. 내 시스템 (PHP 5.3)에서 이것은 재현 가능합니다 :PHP 10 진수로 인해 이상한 결과가 발생합니다

$number = 34706; 
$number2 = $number/100; 

// returns: number2: 347.06 
print "number2: $number2<br>"; 

$number3 = -347; 

$result = $number2 + $number3; 

// returns: "Result: 0.060000000000002 
print "Result: $result"; 

나는 이미 인터넷을 검색했습니다. 여기에 설명 된 일반적인 부동 소수점 산술 오류의 표현인가요? : http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

저는 돈을 계산할 때마다 그것을 극복하기 위해 모든 계산에 round()를 사용할 수 있습니다. 값.

그러나 아직도 나는 그것을 다루어야 만하고 프로그래밍 언어 이상의 수준에서 다루어지지 않는다. 위와 같은 결과는 누군가에게 유용 할 수 있습니다.

+1

옙 ... 부동 소수점 올림! PHP 자체가 아니라 디지털 컴퓨터와 보편적입니다. 프로세서의 비트 수가 많을수록'.060000000000000000002'에서 더 많은 0을 얻을 수 있지만 거의 항상 마지막 숫자가됩니다. – YvesLeBorg

답변

1

맞습니다. 이것은 언급 한 부동 소수점 오류입니다. 돈을 가지고 일하는 경우 끊임없이 반올림하는 대신 bcmath 함수를 살펴보십시오.

http://php.net/manual/en/book.bc.php

0

하지만 그것을 처리해야하고 그것이 프로그래밍 언어 또는 위의 수준에서 처리되지 않는 이유 여전히 궁금하다. 위와 같은 결과는 누군가에게 유용 할 수 있습니다.

문제는 다음과 같습니다. 컴퓨터 수준에서는 소수가 아닙니다. PC는 Integers를 여러 비트로 만 알고 있습니다. 그 (것)들을 추가하고 뺄 수는 있지만, 결코 0,anything 비트가 될 수는 없습니다. 10 진수를 얻으려면 컴퓨터에서 가수와 밑수로 계산합니다. 그게 항상 inacurat이고 당신은 항상 조금있을 것입니다.

두 가지 방법으로 처리 할 수 ​​있습니다.
1) 뒤에서 얼마나 멀리 있는지 확인하고 잘라냅니다. 귀하의 경우 0.060000000000002에서 쉼표 다음 10 자리 뒤에 간단히자를 수 있습니다.
2) 부적절한 생활을 할 수 없다면 부유물을 사용하지 마십시오. 십진법이 필요없는 영역으로 이동하십시오. 결과를 얻었을 때 10 번으로 멀티 플레이를하고 나중에 다시 나눕니다.