MySQL 부동 소수점 비교 결함
MySQL 데이터베이스 스키마에 부동 소수점 열을 도입하는 것이 유용하다는 것이 입증되었지만 부동 소수점 값과 관련된 비교는 때때로 결과를 가져올 수 있습니다. 신뢰할 수 없는 결과.
설명:
다음 값이 포함된 포인트 열이 있는 테이블을 생각해 보세요.
1 - 50.12 2 - 34.57 3 - 12.75 4 - ...(all other values are less than 12.00)
쿼리 실행:
SELECT COUNT(*) FROM `users` WHERE `points` > "12.75"
예기치 않게 "3"을 반환합니다.
MySQL 부동 소수점 값 비교는 불일치가 발생하기 쉽고 이러한 비교에는 10진수 데이터 유형이 더 나은 선택이라는 것은 알려진 사실입니다.
Float 유형을 계속 사용할 수 있습니까?
정확한 부동 소수점 비교를 위해 일반적으로 DECIMAL 데이터 유형을 사용하는 것이 권장되지만, 다음 사항을 알고 있다면 여전히 float 유형을 사용할 수 있습니다. 잠재적인 함정. 그러한 함정 중 하나는 계산 중에 약간의 정밀도 손실이 발생할 수 있다는 것입니다.
예를 들어 다음 표를 고려해 보겠습니다.
CREATE TABLE a (num float); INSERT INTO a VALUES (50.12); INSERT INTO a VALUES (34.57); INSERT INTO a VALUES (12.75); INSERT INTO a VALUES (11.22); INSERT INTO a VALUES (10.46); INSERT INTO a VALUES (9.35); INSERT INTO a VALUES (8.55); INSERT INTO a VALUES (7.23); INSERT INTO a VALUES (6.53); INSERT INTO a VALUES (5.15); INSERT INTO a VALUES (4.01);
쿼리 실행:
SELECT SUM(num) FROM a;
결과는 다음과 같습니다.
159.94000005722
예기치 않은 "0.00000005722"에 주목하세요. 이러한 반올림 오류로 인해 비교 불일치가 발생할 수 있습니다.
이러한 문제를 완화하려면 부동 소수점 열을 지정된 정밀도와 소수 자릿수를 사용하여 DECIMAL 데이터 유형으로 변환할 수 있습니다. 예:
ALTER TABLE a MODIFY num DECIMAL(6,2); SELECT SUM(num) FROM a;
이제 결과는 다음과 같습니다.
159.94
DECIMAL 데이터 유형을 사용하면 정확한 비교를 보장하고 MySQL의 부동 소수점 값과 관련된 정밀도 문제를 피할 수 있습니다. .
위 내용은 MySQL 부동 소수점 비교가 부정확한 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!