MySQL 부동 소수점 비교가 부정확한 이유는 무엇입니까?

Susan Sarandon
풀어 주다: 2024-11-07 12:12:02
원래의
456명이 탐색했습니다.

Why Are MySQL Floating-Point Comparisons Inaccurate?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿