>  기사  >  백엔드 개발  >  PHP 바닥 함수 문제입니다.

PHP 바닥 함수 문제입니다.

WBOY
WBOY원래의
2016-08-08 09:31:091589검색



저는 현재 금융에 관한 프로젝트를 작성하고 있습니다. 십진수 관련 문제가 많이 있습니다. 한번은 Floor를 사용하여 소수점 이하 두 자리까지 내림할 때 갑자기 다음 코드가 비정상적인 것을 발견했습니다.

$money=271.28;
echo $money=floor($money*pow(10,2))/100
출력이 271.28이 아니라 271.27이 나와서 깜짝 놀랐습니다!

많은 정보를 확인한 후 PHP 공식 홈페이지에서 이런 내용을 봤습니다.

부동소수점 숫자는 정밀도가 제한되어 있습니다. 0.1 또는 0.7과 같이 소수 표기법으로 정확하게 표현할 수 있는 유리수. , 가수가 아무리 많아도 내부적으로 사용되는 바이너리로 정확하게 표현되지 않기 때문에 약간의 정밀도를 잃지 않고 바이너리 형식으로 변환할 수 없습니다. 이로 인해 혼란스러운 결과가 발생할 수 있습니다. 예를 들어 floor((0.1+0.7)*10)은 일반적으로 7을 반환합니다. 8이 예상됩니다. 결과의 내부 표현이 실제로 7.9999999999999991118...과 유사하기 때문입니다. 따라서 부동 소수점 숫자 결과가 마지막 자리까지 정확하다고 절대 신뢰하지 말고, 두 부동 소수점 숫자가 같은지 비교하지 마세요.

나중에 위 작업의 결과를 인쇄했습니다.

printf("%.12f", $money*pow(10,2));
결과는 다음과 같습니다. 27127.999999999996

결과는 다음과 같습니다. 정확성 문제. 아직 통일된 솔루션은 발견되지 않았습니다. 두 자리까지 정확한 데이터를 재처리하는 것을 방지하기 위해 코드 로직에

if ($money - round ( $money, 2 ) < 0.00001) {

}else{
$money=floor($money*pow(10,2))/100;
}
만 추가할 수 있습니다.

위 함수를 구현하는 다른 방법(소수점 두 자리까지 정확하고 세 번째 자리는 모두 삭제)을 아는 사람이 있으면 알려주세요.

위 내용은 PHP의 바닥 기능 문제를 소개합니다. , 관련 내용을 포함하여 PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.