부동 소수점 산술은 종종 오해를 받는 복잡한 주제로 현대 컴퓨터 시스템에 널리 퍼져 있습니다. 대부분의 분수에는 정확한 이진 표현이 부족하므로 반올림이 불가피하게 발생합니다. "모든 컴퓨터 과학자가 부동 소수점 연산에 대해 알아야 할 사항"에 설명된 대로 부동 소수점 연산의 미묘한 차이를 이해하는 것이 중요합니다.
답변: 아니요, php.ini 정밀도 설정을 사용할 수 없습니다. 계산 중에 정밀도 길이가 증가할 수 있기 때문에 10^6 미만의 숫자에 대해서도 일관된 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
답변: 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 함수를 고려하십시오.
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;
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3