각 부동 소수점 유형의 저장 크기와 범위는 다음 표에 계획되어 있습니다.
유형 | 크기 | 범위(부호 있음) | 범위(부호 없음) | 목적 |
---|---|---|---|---|
== float== | 4바이트 | (-3.402 823 466 E+38, 494 351E - 38), 0, (1.175 494 351 E-38, 3.402 823 466 351 E+38) | 0, (1.175 494 351 E-38, 3.402 823 466 E+38) | 단일 정밀도 부동 소수점 값 |
==double== | 8바이트 | (-1.797 693 134 862 315 7 E+308, -2.225073858507 2014E-308), 0, (2.225 073 858 507 201 4 E-308 , 1.79 7 693 134 862 315 7 E+308) | 0, (2.225 073 858 507 201 4 E-308, 1.797 693 134 862 315 7 E+308) | 이중 정밀도 부동 소수점 값 |
십진수 | 십진수(M, D) , M>D이면 M+2, 그렇지 않으면 D+2 | M과 D의 값에 따라 다름 | M과 D의 값에 따라 | 소수값 |
MySQL의 이 세 가지 유형은 모두 부동 소수점 유형입니다. 이들의 차이점은 무엇인가요? ?
<code><strong>这里肯定有些小伙伴要问了 什么是单精度 什么是双精度 ? 下面我们就来简单了解一下吧!</strong>
我们知道一个bytes(字节) 占8位 对吧!
float单精度 存储浮点类型的话 就是 ==4x8=32位的长度== , 所以float单精度浮点数在内存中占 4 个字节,并且用 32 位二进制进行描述
那么 double双精度 存储浮点类型就是 ==8x8 =64位的长度==, 所以double双精度浮点数在内存中占 8 个字节,并且用 64 位二进制进行描述 通过计算、那么64位就可以获得更多的尾数!
尾数 : ==就是小数点后的有多少个数位==
所以这里的精度主要取决于==尾数==部分的位数, 所以根据IEEE二进制浮点数算术标准 来计算得出结论:
float单精度小数部分只能精确到后面6位,加上小数点前的一位,即有效数字为7位
double双精度小数部分能精确到小数点后的15位,加上小数点前的一位 有效位数为16位。
最后就区别出了小数点后边位数的长度,越长越精确!
double 和 float 彼此的区别:
double 和 float 彼此的优缺点:
float单精度
优点: float单精度在一些处理器上比double双精度更快而且只占用double双精度一半的空间
缺点: 但是当值很大或很小的时候,它将变得不精确。
double双精度
여기에 작은 것이 있을 것입니다. 내 친구가 묻고 싶은 것은 단정밀도가 무엇이고 배정밀도가 무엇입니까? 간단히 살펴보겠습니다!
그러면 배정밀도 저장 부동 소수점 유형은 ==8x8 =64비트 길이==입니다. 따라서 배정밀도 부동 소수점 숫자는 메모리에서 8바이트를 차지하고 64비트 이진수로 설명됩니다. 계산을 통해 64비트는 더 많은 가수를 얻을 수 있습니다!
Mantissa
: ==소수점 이하 자릿수입니다. == 여기서 정확도는 주로 ==mantissa== 부분의 자릿수에 따라 달라집니다.IEEE 이진 부동 소수점 산술 표준
에 따르면 결론은 다음과 같습니다.단일- float의 정밀도 소수 부분은 소수점 뒤 6자리와 소수점 앞 1자리까지만 정확할 수 있습니다. 즉, 배정밀도 소수 부분은 소수점 뒤 15자리 + 소수점 1자리까지 정확할 수 있습니다. 소수점 앞의 유효 자릿수는 16자리입니다. 마지막으로 소수점 이하 자릿수의 길이를 구분하면 길수록 정확해집니다!
double과 float의 차이점:
메모리에서 차지하는 바이트 수가 다릅니다. , 단정밀도 메모리는 4바이트를 차지하고 배정밀도 메모리는 8바이트를 차지합니다
유효 자릿수가 다릅니다(가수) 단정밀도는 소수점 이하 7자리, 배정도는 소수점 이하 16자리입니다
The 값 범위가 다릅니다 IEEE 표준에 따라 계산됩니다!
프로그램의 처리 속도가 다릅니다. 일반적으로 CPU는 배정밀도 부동 소수점 숫자보다 단정밀도 부동 소수점 숫자를 처리합니다.
이중 및 부동 소수점 서로의 장점과 단점이 있습니다.
float 단정밀도장점: float 단정밀도는 일부 프로세서에서 배정밀도보다 빠르며 배정밀도 공간의 절반만 차지합니다 단점: 그러나 값이 너무 크거나 작을 경우 부정확해집니다.이중 배정밀도
사용 방법을 선택하는 방법 double 및 float 시나리오!
우선: 단정밀도를 사용하여 메모리를 절약하고 연산 속도를 높일 수 있다면 배정밀도를 사용하지 마세요!🎜🎜float: 물론 소수 부분이 필요하고 정확도가 높지 않은 경우 요구 사항에 따라 단정밀도 부동 소수점 비교를 위해 float를 선택하세요. 좋습니다!🎜🎜double: 소수 자릿수 정밀도가 높기 때문에 고속 수학 계산, 과학 계산, 위성 위치 계산 등에 배정밀도가 사용됩니다. 프로세서의 유형은 실제로 단정밀도 유형보다 빠르므로 다음과 같습니다. 필요한 경우 많은 반복에 걸쳐 정확도를 유지하거나 매우 큰 숫자로 작업할 때 배정밀도가 최선의 선택입니다. 🎜🎜실제로는 소수점 뒤에 몇 개의 자릿수가 예약되어 있는지가 중요합니다! 🎜🎜== double과 float의 요약: ==🎜🎜float는 더 적은 수의 소수점을 나타내는 반면, double은 더 많은 소수점을 나타낼 수 있습니다. 정확한! 상황에 따라 선택하면 간단해요! 🎜🎜🎜double과 float 뒤에 있는 길이 m과 d는 무엇을 의미하나요? 🎜🎜🎜double(m,d)와 float(m,d) 여기서 m과 d는 무엇을 의미하나요? 무엇? 많은 친구들도 불명확합니다! 계속 설명하겠습니다🎜🎜사실 이전 정수 int(n)와 마찬가지로 이러한 유형에도 추가 매개변수가 있습니다: 표시 너비 m과 소수점 이하 숫자 🎜🎜예: float(7,3) 문은 표시되는 값이 7자리를 초과하지 않으며 소수점 이하 3자리가 있다고 규정합니다. double의 경우에도 마찬가지입니다. 🎜🎜MySQL에서는 테이블 필드를 정의할 때 unsigned 및 zerofill 수정자를 사용할 수도 있습니다. float, double 및 십진수 데이터 유형에 사용되며 효과는 int 데이터 유형과 동일합니다. 여기서는 자세히 설명하지 않겠습니다!🎜🎜==요약:==🎜🎜MySQL 문에서 , 테이블 필드는 실제로 정의됩니다. 🎜🎜float(M,D)의 M unsigned는 사용할 수 있는 자릿수를 나타내고, D는 소수점 이하 자릿수를 나타내며, unsigned는 음수가 허용되지 않음을 의미합니다! 🎜🎜double(M,D) in unsigned M은 사용할 수 있는 자릿수를 나타내고, D는 소수점 이하 자릿수를 나타냅니다.🎜🎜==참고:== M>=D!🎜🎜🎜 10진수 유형🎜🎜🎜==1.10진수 소개==🎜🎜 같은 범위에 값을 저장할 때 일반적으로 10진수보다 적은 공간을 사용하며, Double은 8바이트를 사용합니다. 십진수는 M과 D의 값에 따라 달라지므로 공간을 덜 사용합니다 🎜실제 기업 수준의 개발에서는 금액(3888.00위안)을 저장해야 하는 필드를 자주 접하게 됩니다. 이때 데이터 유형은 소수를 사용해야 합니다. MySQL 데이터베이스에서 십진수를 사용하는 구문은 십진수(M,D)입니다. M의 범위는 165이고, D의 범위는 030이고, 그리고 D는 M보다 클 수 없습니다.
==2.최대값==
데이터 유형이 10진수인 필드, 저장할 수 있는 최대값/범위는 얼마입니까? 예: 십진수(5,2), 이 필드는 -999.99~999.99를 저장할 수 있으며 최대값은 999.99입니다. 즉, D는 소수부의 길이를 나타내고, (M-D)는 정수부의 길이를 나타낸다.
==3.저장소== [이해] 십진수 형식의 데이터 저장 형태는 십진수 9자리를 4바이트로 저장하는 것입니다(공식 설명: DECIMAL 열의 값은 십진수 9자리를 4바이트로 압축하는 이진 형식을 사용하여 저장됩니다).
설정된 자릿수가 9의 배수가 아닐 수도 있습니다. 공식에서는 비교를 위해 다음 표도 제공합니다.
바이트 수 | |
---|---|
0 | |
1. 필드 십진수(18,9), 18-9=9이므로 정수 부분과 소수 부분이 모두 9이고 각 변이 4를 차지합니다. 바이트; 2. 필드 십진수(20,6), 20-6=14, 소수 부분은 6으로 위 표의 3바이트에 해당하고, 정수 부분은 14, 14-9=5, 즉 4바이트입니다. 게다가 테이블에 3바이트도 추가 | 그래서 우리는 소수점을 설정할 때 보통 소수점 형식을 사용합니다!! |
mysql> drop table temp2; Query OK, 0 rows affected (0.15 sec) mysql> create table temp2(id float(10,2),id2 double(10,2),id3 decimal(10,2)); Query OK, 0 rows affected (0.18 sec) mysql> insert into temp2 values(1234567.21, 1234567.21,1234567.21),(9876543.21, -> 9876543.12, 9876543.12); Query OK, 2 rows affected (0.06 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> select * from temp2; +------------+------------+------------+ | id | id2 | id3 | +------------+------------+------------+ | 1234567.25 | 1234567.21 | 1234567.21 | | 9876543.00 | 9876543.12 | 9876543.12 | +------------+------------+------------+ 2 rows in set (0.01 sec) mysql> desc temp2; +-------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------------+------+-----+---------+-------+ | id | float(10,2) | YES | | NULL | | | id2 | double(10,2) | YES | | NULL | | | id3 | decimal(10,2) | YES | | NULL | | +-------+---------------+------+-----+---------+-------+ 3 rows in set (0.01 sec)复制代码 로그인 후 복사 | Small Case 2mysql> drop table temp2; Query OK, 0 rows affected (0.16 sec) mysql> create table temp2(id double,id2 double); Query OK, 0 rows affected (0.09 sec) mysql> insert into temp2 values(1.235,1,235); ERROR 1136 (21S01): Column count doesn't match value count at row 1 mysql> insert into temp2 values(1.235,1.235); Query OK, 1 row affected (0.03 sec) mysql> mysql> select * from temp2; +-------+-------+ | id | id2 | +-------+-------+ | 1.235 | 1.235 | +-------+-------+ 1 row in set (0.00 sec) mysql> insert into temp2 values(3.3,4.4); Query OK, 1 row affected (0.09 sec) mysql> select * from temp2; +-------+-------+ | id | id2 | +-------+-------+ | 1.235 | 1.235 | | 3.3 | 4.4 | +-------+-------+ 2 rows in set (0.00 sec) mysql> select id-id2 from temp2; +---------------------+ | id-id2 | +---------------------+ | 0 | | -1.1000000000000005 | +---------------------+ 2 rows in set (0.00 sec) mysql> alter table temp2 modify id decimal(10,5); Query OK, 2 rows affected (0.28 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> alter table temp2 modify id2 decimal(10,5); Query OK, 2 rows affected (0.15 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> select * from temp2; +---------+---------+ | id | id2 | +---------+---------+ | 1.23500 | 1.23500 | | 3.30000 | 4.40000 | +---------+---------+ 2 rows in set (0.00 sec) mysql> select id-id2 from temp2; +----------+ | id-id2 | +----------+ | 0.00000 | | -1.10000 | +----------+ 2 rows in set (0.00 sec)复制代码 로그인 후 복사 |
mysql 영상 튜토리얼 | |
위 내용은 MySQL의 부동 소수점, 이중 및 십진 부동 소수점 유형 간의 차이점을 요약합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!