집 >데이터 베이스 >MySQL 튜토리얼 >MySQL 부동 소수점 비교가 부정확한 이유는 무엇입니까?
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!