>백엔드 개발 >PHP 문제 >PHP 부동 소수점 계산이 부정확한 이유는 무엇입니까?

PHP 부동 소수점 계산이 부정확한 이유는 무엇입니까?

PHPz
PHPz원래의
2023-04-23 10:09:121785검색

PHP 프로그래밍에서는 부정확한 부동 소수점 계산 문제에 직면할 수 있습니다. 이 문제의 원인과 해결 방법을 이해하면 코드의 신뢰성과 정확성을 향상시킬 수 있습니다.

1. 문제의 원인

부동소수점 숫자는 부동소수점 숫자를 표현하는 매우 편리한 방법이지만 몇 가지 단점도 있습니다. 주된 이유는 컴퓨터가 이진수를 사용하여 숫자를 저장하고 모든 부동 소수점 숫자를 정확하게 표현할 수 없기 때문입니다. 이로 인해 반올림 오류가 발생하고 정밀도가 손실됩니다.

예를 들어 간단한 부동 소수점 계산을 상상해 보세요.

0.1 + 0.2 = 0.3

PHP에서 이 코드의 결과는 다음과 같습니다.

echo 0.1 + 0.2; //0.30000000000000004

분명히 이 결과는 우리가 예상한 결과가 아닙니다. 0.1과 0.2는 이진수로 정확하게 표현할 수 없어 반올림 오류가 발생하기 때문입니다. 이 오류는 일반적으로 작지만 정확도가 떨어지거나 일부 고정밀 계산에서 오류가 발생하는 데 충분합니다.

2. 솔루션

부정확한 부동 소수점 계산 문제에 대해 다음 솔루션을 채택할 수 있습니다.

  1. 정수 계산 사용

정확한 계산을 수행할 때 먼저 부동 소수점 숫자를 정수로 변환한 다음 계산할 수 있습니다. . 계산이 완료된 후 결과는 다시 부동 소수점 숫자로 변환됩니다.

예를 들어 다음 부동 소수점 계산을 고려해보세요.

1.23 + 4.56 = 5.79

부동 소수점 숫자는 계산을 위해 정수로 변환될 수 있습니다.

$num1 = 123;
$num2 = 456;

$result = ($num1 + $num2) / 100; // 5.79
  1. BCMath 사용

PHP는 임의의 정밀도 숫자를 정확하게 계산하는 데 사용할 수 있는 BCMath 확장을 제공합니다. . 부동 소수점 계산은 부동 소수점 숫자 대신 문자열을 사용하여 숫자를 나타내는 BCMath 라이브러리를 사용하여 수행할 수 있습니다.

예를 들어 BCMath 함수 라이브러리를 사용하여 다음을 계산합니다.

$val1 = '0.1';
$val2 = '0.2';

echo bcadd($val1, $val2, 1); // 0.3

이 예에서는 bcadd() 함수를 사용하여 정확한 부동 소수점 덧셈을 수행합니다.

  1. round() 함수를 사용하세요

어떤 경우에는 round() 함수를 사용하여 정밀도 오류를 줄일 수 있습니다. round() 함수는 부동 소수점 숫자를 지정된 소수 자릿수로 반올림합니다.

예를 들어 다음 계산을 고려해 보세요.

$num1 = 0.1;
$num2 = 0.2;

$result = round($num1 + $num2, 1); // 0.3

이 예에서는 round() 함수를 사용하여 결과를 소수점 이하 한 자리로 반올림합니다. 이것이 정확도 오류를 완전히 제거하지는 못하지만 결과는 예상 결과에 훨씬 더 가깝습니다.

  1. 부동 소수점 숫자를 직접 비교하지 마세요

부동 소수점 숫자를 비교할 때 일부 내결함성 메커니즘을 사용해야 합니다. 부동 소수점 숫자의 정밀도는 반올림 오류로 인해 어려움을 겪을 수 있으므로 일반적으로 두 부동 소수점 숫자의 값을 직접 비교하는 것은 신뢰할 수 없습니다.

예를 들어 다음 부동 소수점 비교를 고려해 보세요.

$val1 = 3.14159265;
$val2 = 3.14159267;

if ($val1 == $val2) {
  echo 'val1 等于 val2';
} else {
  echo 'val1 不等于 val2';
}

이 예에서는 두 개의 부동 소수점 숫자를 비교합니다. 이 두 숫자는 가깝지만 동일하지는 않습니다. 따라서 코드는 "val1이 val2와 같지 않습니다"를 출력합니다.

두 개의 부동 소수점 숫자를 비교해야 하는 경우 허용오차 값이나 델타 값을 사용할 수 있습니다. 공차 값은 부동 소수점 숫자의 작은 오류를 허용할 수 있는 작은 숫자입니다.

예를 들어 허용되는 최대 정밀도 오류를 나타내는 델타 값을 정의할 수 있습니다.

$delta = 0.00000001;

델타 값을 사용하면 다음 코드를 사용하여 부동 소수점 숫자를 비교할 수 있습니다.

$val1 = 3.14159265;
$val2 = 3.14159267;

if (abs($val1 - $val2) < $delta) {
  echo 'val1 等于 val2';
} else {
  echo 'val1 不等于 val2';
}

이 예에서는 abs() 함수 두 부동 소수점 숫자의 차이를 계산하고 델타 값과 비교합니다. 두 숫자의 차이가 델타 값보다 작으면 동일한 것으로 간주됩니다.

즉, 부정확한 부동 소수점 계산 문제는 일반적인 문제입니다. PHP에서는 정수 연산, BCMath 함수 라이브러리, round() 함수, 델타 값 허용 오차 등의 방법을 사용하여 이 문제를 해결할 수 있습니다. 상황에 따라 다양한 솔루션을 선택할 수 있습니다.

위 내용은 PHP 부동 소수점 계산이 부정확한 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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