본문 바로가기
MySql

MySQL 라운드가 예상보다 더 많이 떠 다니는 이유는 무엇입니까?

by 베이스 공부 2020. 12. 6.
반응형
UPDATE some_table SET some_float_field=1919.987 WHERE id=123

SELECT * FROM some_table WHERE id=123

여기서 some_float_field는 "float"(특정 크기 값 없음)로 정의 된 필드입니다.

예상 결과 값은 1919.987이됩니다. 대신 1919.99로 반올림됩니다.

왜? 32 비트 (단일 정밀도) 플로트는이를 올바르게 저장하기에 충분한 정밀도를 가지고 있습니다!

 

해결 방법

 

쿼리를 실행할 때 :

SELECT * FROM some_table WHERE id = 123

사용자 인터페이스를 사용하여 부동 소수점 숫자를 형식화합니다. 사용중인 인터페이스는 두 개 이상의 문자를 사용하고 있습니다. 결국 표시 할 "올바른"번호에 대한 정보가 없습니다.

숫자를 문자열 또는 십진수로 형식화하여 인터페이스가 올바른 숫자를 표시하도록 할 수 있습니다. 예를 들면 :

select format(some_float_field, 3)

이것을 소수점 세 자리의 문자열로 변환합니다. 주의 사항 : 원하지 않는 쉼표도 추가됩니다. 이것은 또한 작동합니다.

select cast(some_float_field as decimal(8, 3))

트릭도해야합니다.

다음과 같은 작업을 수행하여 데이터가 올바른지 쉽게 확인할 수 있습니다.

select *
from some_table
where some_float_field between 1919.987 - 0.0001 and 1919.987 + 0.0001;

부동 소수점 값에 = 를 사용하고 싶지는 않지만 이미 이해하고 있습니다.

 

참조 페이지 https://stackoverflow.com/questions/23120584

 

 

반응형

댓글