2009-08-19 5 views
21

내가 같은 식별자와 가격에 따라 테이블,에 SELECT 일치를 수행하려고에 float를 선택 : 당신이 price='101.31' 비트를 제거하면 동안MySQL의

SELECT * FROM `table` WHERE `ident`='ident23' AND `price`='101.31'; 

위의 반환, 행을 제로 올바른 행을 리턴합니다. 이렇게

...

SELECT * FROM `table`; 

상기와 같은 행을 반환하고 아주 명확하게 price='101.31' 상태. 그러나 그것을 선택하는 것은 실패합니다. =에서 <=으로 변경하면 제대로 작동하지만 해결책은 아닙니다.

작업을 수행하기 전에 MySQL float을 2 자리로 캐스팅하는 방법이 있습니까? 따라서 위의 SELECT (또는 다른 해결책)을 만드시겠습니까?

감사합니다. 이 라인을 따라

답변

35

은 나를 위해 일한 :

SELECT * FROM table WHERE CAST(price AS DECIMAL) = CAST(101.31 AS DECIMAL); 

그러나, 당신은 단지 첫번째 장소에있는 price 열에게 DECIMAL을 고려할 수 있습니다. DECIMAL은 일반적으로 화폐 가치를 다룰 때 사용할 수있는 최상의 유형으로 간주됩니다.

+4

참고 :'DECIMAL (M, D)'를 사용하십시오. 'CAST (101.31 AS DECIMAL) = 101' –

-1

아마 뭔가 : 부동는 본질적으로 부정확하기 때문에

SELECT * FROM table WHERE ident='ident23' AND ABS(price - 101.31) < .01; 
11

그것은 작동하지 않습니다. 실제 값은 아마도 '101.3100000000001'과 같습니다. 먼저 ROUND()를 사용하여이 값을 2 자리로 반올림하거나 부동 소수점 대신 DECIMAL 유형을 사용하는 것이 좋습니다. 소수에 캐스팅

8

돈을 위해 수레를 사용하지 마십시오.

+6

어디에서 고객을 변경합니까? (유감 스럽지만 가게 주인 유머 감각이 조금있다 :) – Meep3D

-1

이 방법이 효과가 있습니까?

SELECT * , ROUND(price, 2) rounded 
FROM table 
WHERE ident = 'ident23' 
HAVING rounded = 101.31 
6

오늘, 나는 또한 단지의 MySQL의 포맷 기능을 사용하여, 그것은 정확히 WHERE 절과 일치하는 결과를 반환합니다 같은 상황을 가로 질러 와서 해결하세요.

SELECT * FROM yourtable WHERE FORMAT(col,2) = FORMAT(value,2) 

설명 : FORMAT('col name', precision of floating point number)

0

내가 솔루션을 찾고했지만 결국 나는 내 이전의 PHP로 number_format를 사용했다() hmasif의 솔루션 @보고 들어왔다.

사용이를 당신이 당신의 플로트를 얻을 수 있습니다 - MySQL의 일치 : 5 소수점에서 5 문자열입니다

$floatmatch = number_format((float)$yourfloatvariable,5); 

. 예 : 7.93643