2012-02-22 2 views
1

MySQL에 부동 값을 저장하려고하는데 값이 엉망이 된 것처럼 보입니다. :(
은 내 필드는 float(10,7)로 정의하고 내가 그들을 삽입하기 전에 PHP에서 제대로 내 값을 반올림 :MySQL에 저장된 부동 소수점 값이 계속 엉망이 됨

$rndval = round($val,7) 
INSERT INTO mytable (float) VALUES ($rndval) 

을하지만 같은 값 47.5206797를 삽입 할 때, 그것의 47.520679 5로 나타 내 테이블. 왜인가?

+0

이 열이 테이블에 정의하는 방법을 게시하시기 바랍니다 읽을 가치가있을 수 있습니다. PHP의 "float"은 다른 언어의 "double"과 동일해야합니다. – paulsm4

+0

언급 한 바와 같이 : float (10,7) – cerr

답변

5

당신이 정확하게에 값을해야 할 경우, FLOAT(10,7)과 같은 범위를 제공 할 정확한 데이터 유형과 같은 DECIMAL(17,7)로 저장합니다. 유일한 아래쪽은 DECIMAL이 걸릴 것입니다 동등한 것보다는 디스크 공간 FLOAT, 그러나 thi s는 정밀도가 중요한 부동 소수점 오류를 수정하는 것과 비교하면 사소합니다.

http://dev.mysql.com/doc/refman/5.0/en/fixed-point-types.html

부동 소수점 숫자 문제에 대한 자세한 내용은 다음은

http://dev.mysql.com/doc/refman/5.0/en/problems-with-float.html

+0

니스, 네, 그 트릭을 정확히했습니다! 사이먼 감사합니다! :) – cerr

+0

@cerr :'DECIMAL (10,7)'에는'-999.9999999'부터'+ 999.9999999'까지만 값을 저장할 수 있다는 것을 명심하십시오. 그리고 MySQL 설정에 따라, 당신이 적합하지 않은 값을 저장하려고하면 이상한 일이 발생할 수 있습니다. (정확히 말하면'1267.3') –

+0

정확히 말하면, FLOAT (10,7)은 아마도 DECIMAL (17, 7). 숫자에 확신이 없기 때문에 데이터 저장 지점을 제거하겠습니다. DECIMAL이 FLOAT에 대해 4와 비교하여 9 바이트를 필요로하지만 맞다면. –