>  기사  >  백엔드 개발  >  정확한 돈 계산을 위해 PHP의 `php.ini` 정밀도를 신뢰할 수 있습니까?

정확한 돈 계산을 위해 PHP의 `php.ini` 정밀도를 신뢰할 수 있습니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-06 10:27:02816검색

 Can I Rely on PHP's `php.ini` Precision for Accurate Money Calculations?

부동 소수점 문제에 대해 PHP php.ini 정밀 해결 방법을 사용할 수 있습니까?

소개

부동 소수점 산술은 종종 오해를 받는 복잡한 주제로 현대 컴퓨터 시스템에 널리 퍼져 있습니다. 대부분의 분수에는 정확한 이진 표현이 부족하므로 반올림이 불가피하게 발생합니다. "모든 컴퓨터 과학자가 부동 소수점 산술에 대해 알아야 할 사항"에 설명된 대로 부동 소수점 연산의 미묘한 차이를 이해하는 것이 중요합니다.

질문 및 답변


< h3>질문 1: 정확한 2자리 계산(예: 돈)을 위해 정밀 해결 방법을 사용할 수 있나요?

답변: 아니요, PHP에 의존할 수 없습니다. 계산 중에 정밀도 길이가 증가할 수 있으므로 10^6 미만의 숫자에 대해서도 일관된 2자리 정확도를 위한 ini 정밀도 설정입니다.

질문 2: 정밀도 해결 방법이 실패하는 명확한 예를 제공하세요.

답변: 첫 번째 킬로그램에만 10% 할인이 적용되는 다음 예를 생각해 보세요.

ini_set('precision', 8); // Your precision
$a = 5.88; // Cost of 1kg
$q = 2.49; // User buys 2.49 kg
$b = $a * 0.01; // 10% Discount only on the first kg
echo ($a * $q) - $b;

출력: 14.5824 <- --- 정확한 2자리 계산이 아님

질문 3: 2자리 돈 계산에 적합한 php.ini.precision 값은 무엇입니까?

답변: PHP 정밀도 설정은 재무 계산이나 부동 소수점 정밀도에 대한 신뢰할 수 있는 기반이 아닙니다. 전문적인 라이브러리나 메소드를 사용하는 것이 좋습니다.

계산 예

정확도 제한을 설명하기 위해 다양한 예를 살펴보겠습니다.

$a = 342349.23;
$b = 341765.07;

// Example A: precision = 20
echo $a - $b, PHP_EOL; // 584.15999999997438863
echo floatval(round($a - $b, 2)), PHP_EOL; // 584.15999999999996817 (rounding introduces instability)
echo number_format($a - $b, 2), PHP_EOL; // 584.16
echo bcsub($a, $b, 2), PHP_EOL; // 584.15

// Example B: precision = 14
echo $a - $b, PHP_EOL; // 584.15999999997
echo floatval(round($a - $b, 2)), PHP_EOL; // 584.16
echo number_format($a - $b, 2), PHP_EOL; // 584.16
echo bcsub($a, $b, 2), PHP_EOL; // 584.16

// Example C: precision = 6
echo $a - $b, PHP_EOL; // 584.16
echo floatval(round($a - $b, 2)), PHP_EOL; // 584.16
echo number_format($a - $b, 2), PHP_EOL; // 584.16
echo bcsub($a, $b, 2), PHP_EOL; // 584.00

// Example D: precision = 3
echo $a - $b, PHP_EOL; // 584
echo floatval(round($a - $b, 2)), PHP_EOL; // 584
echo number_format($a - $b, 2), PHP_EOL; // 584.16 (consistent)
echo bcsub($a, $b, 2), PHP_EOL; // 0.00

이러한 예는 정확한 계산을 위해 PHP 정밀도 설정에 의존하는 데 따른 불일치를 보여줍니다.

결론

신뢰할 수 있는 재무 계산을 위해서는 부동 소수점 및 센트 사용을 잊어버리세요. 일관된 2자리 정확도를 위해 number_format 함수를 고려하세요.

Update

ini_set('precision', 8);

$a = 0.19;
$b = 0.16;
$c = 0.01;
$d = 0.01;
$e = 0.01;
$f = 0.01;
$g = 0.01;

위 내용은 정확한 돈 계산을 위해 PHP의 `php.ini` 정밀도를 신뢰할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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