mysql에서 float를 이중으로 변환하는 데 중요한 숫자를 처리하는 데 문제
첫 번째 테이블의 열이 있는 MariaDB 데이터베이스에서 한 테이블의 데이터를 다른 테이블에 삽입하고 있습니다.FLOAT
그리고 두 번째에는.DOUBLE
데이터는 크기, 정밀도 및 소수점 이하의 값을 가질 수 있습니다.
직접 복사를 수행하면 값이 다음과 같이 변경됩니다.
INSERT INTO data2 (value) SELECT value FROM data1
값은 다음과 같이 랜덤으로 추가로 유의한 수치가 제공됩니다.
FLOAT in data1 DOUBLE in data2
-0.000000000000454747 -0.0000000000004547473508864641
-122.319 -122.31932830810547
14864199700 14864220160
CAST(value AS DECIMAL(65,30))
뒤에 0이 표시되는 것을 제외하고는 위의 col 2와 정확히 동일한 값을 생성합니다.
하지만 내가 그냥 할 때는
UPDATE data2 SET value = 14867199700 WHERE id = 133025046;
그DOUBLE
값이 허용됩니다.
모든 값을 SQL 스크립트로 내보낸 후 다시 가져와야 합니까?더 좋은 방법이 없을까요?
몇 시간 동안 이 문제를 실험해 보았지만, 제한적인 특성에도 불구하고 해결책에 크게 근접하지 못했습니다.저는 이것이 마리아DB나 데이터베이스뿐만 아니라 모든 기술을 괴롭히는 문제라는 것을 알 수 있습니다. 그래서 저는 아마 어딘가에서 답을 놓쳤을 것입니다.스택 오버플로는 이전에 보지 못했던 새로운 제안 기능으로 해결책을 안내하려고 필사적으로 노력하고 있지만, 안타깝게도 다른 제안 답변과 마찬가지로 도움이 되지 않습니다.
당신의 테스트 케이스에 결함이 있습니다.당신은 10진수로 먹이를 주고 있으며, 단지 전달을 테스트하는 것이 아닙니다.FLOAT
로.DOUBLE
.
UPDATE tbl SET double_col = float_col
항상 동일한 값을 복사합니다.왜냐하면DOUBLE
표현은 다음의 초집합입니다.FLOAT
표현(53 vs 24 비트의 정밀도 등).
리터럴, 소수점 이하:UPDATE tbl SET double_col = 123.456
소수점에서 소수점으로 반올림하기 때문에 숫자를 망칩니다.DOUBLE
할 수 있는 일float_col
게다가, 망가진 결과는 다를 것입니다!
구멍 번호 리터럴:UPDATE tbl SET double_col = 14867199700
정확하게 저장됩니다.하지만 만약 당신이 같은 문자를 사용한다면,FLOAT
24비트로 반올림되므로 정확하게 저장할 수 없습니다.다음의 경우 약 7자리에서 정확도가 떨어집니다.FLOAT
그리고 16개 정도는DOUBLE
이 예에서 리터럴은 9자리의 유효 숫자를 가집니다(뒤에 오는 0을 무시한 후).
그건 당신이 받을 수 있는 악몽의 표본일 뿐입니다.
고려해야 합니다.FLOAT
그리고.DOUBLE
대략적으로평등을 위해 절대로 비교해서는 안 됩니다. 무엇이 가치의 마지막 부분을 엉망으로 만들었는지 모릅니다.
또한 MySQL이 언제 식을 수행할지 추측하려고 하면 안 됩니다.DECIMAL
에 DOUBLE
.
또한 분할은 일반적으로 비트 수 또는 소수로 반올림하기 때문에 부정확합니다.
14864199700의 "만티사"는
1.10111010111111001101100 (binary of FLOAT : 24 bits including 'hidden' leading bit)
1.1011101011111100110110000000101000000000000000000000 (binary of DOUBLE)
^ ^ (lost in FLOAT)
그것들 각각은 2의 같은 거듭제곱을 곱합니다.DOUBLE
정확히 14864199700입니다.FLOAT
가리키는 비트가 손실되었습니다.
당신은 https://gregstoll.dyndns.org/ 에서 그런 것들을 가지고 놀 수 있습니다~gregstoll/gregtohex/
믿거나 말거나, 상황은 더 나빴습니다.사람들은 반올림 오류로 인해 $0.00의 요금이 청구될 것입니다.또는 1+1이어야 하는 결과는 1.9999999로 나타났습니다.
언급URL : https://stackoverflow.com/questions/52571514/problems-handling-significant-digits-in-mysql-converting-float-to-double
'sourcecode' 카테고리의 다른 글
PHP에서 "비등한" 연산자 <>와 !=의 차이 (0) | 2023.07.27 |
---|---|
Spring Boot과 함께 dotenv 파일 사용 (0) | 2023.07.27 |
Python 요청 모듈로 PDF 파일 다운로드 및 저장 (0) | 2023.07.27 |
UIPickerView가 로드된 후 행 선택 (0) | 2023.07.27 |
정적 필드는 내부적으로 정확히 어떻게 작동합니까? (0) | 2023.07.27 |