2012-06-19 10 views
2

sellerparams이라는 테이블이 있고 그 중 하나는 probabilityinc입니다. 이 열의 유형은 float입니다.MySQL 쿼리 - 겉으로보기에는 이상한 행동. 이것은 float 값과 관련이 있습니까?

두 번째 쿼리가 예상대로 작동하지 않는 이유를 모르겠습니다.

먼저 쿼리 및

mysql> select id,probabilityinc from temp.sellerparams; 
+----+----------------+ 
| id | probabilityinc | 
+----+----------------+ 
| 1 |   0.3 | 
| 2 |   0.3 | 
| 3 |   0.3 | 
| 4 |   0.4 | 
+----+----------------+ 
4 rows in set (0.01 sec) 

두 번째 쿼리 및 결과 결과 (예상치 못한?)

mysql> select id from temp.sellerparams where probabilityinc=0.4; 
Empty set (0.00 sec) 

당신이 probabilityinc=0.4있는 행이 볼 수 있듯이. 두 번째 선택이 비어있는 이유는 무엇입니까? 이것은 float 값의 내부 표현과 관련이 있습니까? 그렇다면 float 유형의 열을 기반으로 선택을 수행하려면 어떻게해야합니까?

감사합니다.

답변

3

을 말한다. float은 설계 상 부정확합니다. 0.4와 같은 숫자는 약간 다를 수 있습니다. 그렇기 때문에 숫자가 0.39999999

과 같이 저장되면 0.4과 비교하면 실패 할 수 있습니다. 예를 들어 numeric(10,5)을 사용할 수 있습니다.

은 .. 나는이 아는되지 않았 음을 공유하기위한 감사를 the doc

+0

감사합니다. 잘 작동합니다. Decimal (10,5)과 Numeric (10,5) 사이에 차이가 있습니까? documentaion은 "MySQL에서는 NUMERIC이 DECIMAL ...로 구현되었습니다"라고되어 있으므로 그렇지 않습니다. 그러나 그들이 정확히 같은지 알면 좋을 것입니다. – Curious2learn

3

플로트의 정밀도가 매우 낮기 때문에 더 정확한 데이터 형식을 사용하는 것이 좋습니다. 즉,이 부동 소수점을 비교하는 엡실론이 허용 오차를 나타냅니다

select id from temp.sellerparams 
where probabilityinc between (0.4 - epsilon) AND (0.4 + epsilon); 

값 때 항상 허용 오차 값을 사용하는 것이 좋습니다 말했다, 당신은 numeric에 열 유형을 변경해야 0.0001

+0

를 참조하십시오. –

+0

고맙습니다. 그것도 좋은 생각입니다. – Curious2learn