2009-05-22 2 views
4

우리는 Ubuntu 9.04에서 MySql 5.0을 사용하고 있습니다. 정식 버전은 5.0.75-0ubuntu10MySql FLOAT 데이터 유형 및 7 자리 눈금 이상이있는 문제

테스트 데이터베이스를 만들었습니다. 그 안에 테스트 테이블이 있습니다. ...

mysql> CREATE TABLE test (floaty FLOAT(8,2)) engine=InnoDb; 
Query OK, 0 rows affected (0.02 sec) 

mysql> insert into test value(858147.11); 
Query OK, 1 row affected (0.01 sec) 

mysql> SELECT * FROM test; 
+-----------+ 
| floaty | 
+-----------+ 
| 858147.12 | 
+-----------+ 
1 row in set (0.00 sec) 

는 MySQL의에서 설정 한 스케일/정밀도에 문제가 발생한 것 같습니다 또는 난 아무것도를 놓치지 않았다 : 나는 삽입 문에서 다음과 같은 출력을 볼?

UPDATE :

우리가 삽입 된 숫자 중 하나에 대한 경계, 여기에 코드 찾았

mysql> CREATE TABLE test (floaty FLOAT(8,2)) engine=InnoDb; 
Query OK, 0 rows affected (0.03 sec) 

mysql> insert into test value(131071.01); 
Query OK, 1 row affected (0.01 sec) 

mysql> insert into test value(131072.01); 
Query OK, 1 row affected (0.00 sec) 

mysql> SELECT * FROM test; 
+-----------+ 
| floaty | 
+-----------+ 
| 131071.01 | 
| 131072.02 | 
+-----------+ 
2 rows in set (0.00 sec) 

mysql> 
+0

5.067 MySQL을 실행하는 Windows 박스에서 실제로 858147.13을 얻습니다. – itsmatt

답변

9

Face Palm !!!!

플로트는 가수와 지수로 저장된 32 비트 숫자입니다. 100 % MySql이 스토리지를 분할하는 방법을 잘 모르겠지만 Java를 예로 들자면 24 비트를 부호 가형으로, 8 비트를 지수로 사용합니다 (과학 표기법). 즉, FLOAT가 가질 수있는 최대 값은 + 8388608 * 10^127이고 최소값은 -8388608 * 10^127입니다. 이것은 단지 7 개의 유효 자릿수를 의미하며, 나의 FLOAT 정의는 8을 사용했습니다.

이 8,2 모두를 FLOAT에서 DOUBLE로 전환 할 것입니다.

1

MySQL의 문서는 "MySQL은 값을 저장할 때 라운딩 수행"물론 나는이 의심 여기 문제. 귀하의 문제는 중복되었지만 저장 유형을 DOUBLE (으)로 변경했습니다.

CREATE TABLE test (val, DOUBLE); 

검색된 값이 제공 한 테스트 값과 일치합니다.

나의 제안은 가치가있는 무엇을 위해 DOUBLE 또는 DECIMAL을 사용하는 것입니다. 나는 다음과 같은 원래 테스트를 시도했다.

CREATE TABLE test (val, DECIMAL(8,2)); 

그리고 내가 준 값 : 858147.11.