首頁 資料庫 mysql教程 總結MySQL中float、double、decimal三個浮點類型的差異

總結MySQL中float、double、decimal三個浮點類型的差異

Nov 19, 2020 pm 05:13 PM
decimal double float mysql

mysql影片教學欄位總結MySQL中三個浮點類型的差異

總結MySQL中float、double、decimal三個浮點類型的差異

下表中規劃了每個浮點類型的儲存大小和範圍:

##==double==8 bytes(-1.797 693 134 862 315 7 E 308,-2.225073858507 2014E-308),0,(2.225 073 858 507 201 4 E-308,6381 69632# 201 4 E-308,63172201 2132220132522,6312232,63232# 63125322,632122,63212322,632#72,6321232,63232# 63232。 依賴M和D的值
#型別 大小 範圍(有符號) 範圍(無符號) 用途
#==float== 4 bytes (-3.402 823 466 E 38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E 38)##. 351 E-38,3.402 823 466 E 38) 單精確度浮點數值
#0 ,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E 308) #雙精確度浮點數值 #decimal #對decimal(M,D) ,如果M>D,為M 2否則為D 2
依賴M和D的值 小數值

那麼MySQL中這三種都是浮點型別 它們彼此的差別又是什麼呢 ? ?

  1. float 浮點型別用來表示==單精確度浮點==數值,
  2. double浮點型別用來表示==雙精確度浮點==數值

<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 彼此的區別:

  1. 在記憶體中佔有的位元組數不同, 單精確度記憶體佔4個位元組,  雙精度記憶體佔8個位元組
  2. 有效數字位數不同(尾數)  單精確度小數點後有效位數7位,  雙精度小數點後有效位數16位元
  3. 數值取值範圍不同 根據IEEE標準來計算!
  4. 在程式中處理速度不同,一般來說,CPU處理單精度浮點數的速度比處理雙精度浮點數快

double 和float 彼此的優缺點:

float單精度

優點: float單精度在某些處理器上比double雙精度更快而且只佔用double雙精度一半的空間

缺點: 但是當值很大或很小的時候,它將變得不精確。

double雙精確度

優點: double 跟float比較, 必然是double 精確度高,尾數可以有16 位元,而 float 尾數精確度只有7 位元

缺點: double 雙精度是消耗內存的,並且是float 單精度的兩倍! ,double 的運算速度比float 慢得多, 因為double 尾數比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和一個小數點後面帶的個數d

例如: 語句float(7,3) 規定顯示的值不會超過7 位數字,小數點後面帶有3 位數字、double也是同理

在MySQL中,在定義表格欄位的時候,  unsigned和zerofill 修飾符也可以被float、double和decimal資料型別使用, 並且效果與int資料型別相同 跟上面一樣這裡就不多說了!

====小結:==

在MySQL 語句中, 實際定義表格欄位的時候,

float(M,D) unsigned  中的M代表可以使用的數字位數,D則代表小數點後的小數位數, unsigned 代表不允許使用負數!

double(M,D) unsigned 中的M代表可以使用的數字位數,D則代表小數點後的小數位數

==注意:== M>=D!

decimal類型

==1.介紹decimal==

在儲存同樣範圍的值時,通常比decimal使用更少的空間,float使用4個字節存儲,double使用8個字節 ,

而decimal依賴於M和D的值,所以decimal使用更少的空間

在實際的企業級開發中,經常遇到需要儲存金額(3888.00元)的字段,這時候就需要用到資料類型decimal。 在MySQL資料庫中,decimal的使用語法是:decimal(M,D),其中, M 的範圍是165, D 的範圍是030, 而且D不能大於M。

==2.最大值==

資料類型為decimal的字段,可以儲存的最大值/範圍是多少? 例如:decimal(5,2),則該欄位可以儲存-999.99~999.99,最大值為999.99。 也就是說D表示的是小數部分長度,(M-D)表示的是整數部分長度。

==3.儲存==  [了解] decimal類型的資料儲存形式是,將每9位元十進位數儲存為4個位元組

(官方解釋:Values for DECIMAL columns are stored using a binary format that packs nine decimal digits into 4 bytes)。

那有可能設定的位數不是9的倍數,官方也給瞭如下表格對照:

##Number of Bytes001–21 3–42#5–63#7–94
#Leftover Digits
==表格甚麼意思呢,舉個例子:==

# 1.字段decimal(18,9),18-9=9,這樣整數部分和小數部分都是9,那兩邊分別佔用4個位元組; 2.字段decimal(20,6),20-6=14,其中小數部分為6,就對應上表中的3個位元組,而整數部分為14,14-9=5,就是4個位元組再加上表格中的3個位元組

所以通常我們在設定小數的時候,都是用的decimal型別!!


小案例1

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)复制代码
登入後複製

小案例2

mysql> 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中float、double、decimal三個浮點類型的差異的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1424
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
laravel入門實例 laravel入門實例 Apr 18, 2025 pm 12:45 PM

Laravel 是一款 PHP 框架,用於輕鬆構建 Web 應用程序。它提供一系列強大的功能,包括:安裝: 使用 Composer 全局安裝 Laravel CLI,並在項目目錄中創建應用程序。路由: 在 routes/web.php 中定義 URL 和處理函數之間的關係。視圖: 在 resources/views 中創建視圖以呈現應用程序的界面。數據庫集成: 提供與 MySQL 等數據庫的開箱即用集成,並使用遷移來創建和修改表。模型和控制器: 模型表示數據庫實體,控制器處理 HTTP 請求。

MySQL和PhpMyAdmin:核心功能和功能 MySQL和PhpMyAdmin:核心功能和功能 Apr 22, 2025 am 12:12 AM

MySQL和phpMyAdmin是強大的數據庫管理工具。 1)MySQL用於創建數據庫和表、執行DML和SQL查詢。 2)phpMyAdmin提供直觀界面進行數據庫管理、表結構管理、數據操作和用戶權限管理。

MySQL與其他編程語言:一種比較 MySQL與其他編程語言:一種比較 Apr 19, 2025 am 12:22 AM

MySQL与其他编程语言相比,主要用于存储和管理数据,而其他语言如Python、Java、C 则用于逻辑处理和应用开发。MySQL以其高性能、可扩展性和跨平台支持著称,适合数据管理需求,而其他语言在各自领域如数据分析、企业应用和系统编程中各有优势。

解決數據庫連接問題:使用minii/db庫的實際案例 解決數據庫連接問題:使用minii/db庫的實際案例 Apr 18, 2025 am 07:09 AM

在開發一個小型應用時,我遇到了一個棘手的問題:需要快速集成一個輕量級的數據庫操作庫。嘗試了多個庫後,我發現它們要么功能過多,要么兼容性不佳。最終,我找到了minii/db,這是一個基於Yii2的簡化版本,完美地解決了我的問題。

laravel框架安裝方法 laravel框架安裝方法 Apr 18, 2025 pm 12:54 PM

文章摘要:本文提供了詳細分步說明,指導讀者如何輕鬆安裝 Laravel 框架。 Laravel 是一個功能強大的 PHP 框架,它 упростил 和加快了 web 應用程序的開發過程。本教程涵蓋了從系統要求到配置數據庫和設置路由等各個方面的安裝過程。通過遵循這些步驟,讀者可以快速高效地為他們的 Laravel 項目打下堅實的基礎。

解決MySQL模式問題:TheliaMySQLModesChecker模塊的使用體驗 解決MySQL模式問題:TheliaMySQLModesChecker模塊的使用體驗 Apr 18, 2025 am 08:42 AM

在使用Thelia開發電商網站時,我遇到了一個棘手的問題:MySQL模式設置不當,導致某些功能無法正常運行。經過一番探索,我找到了一個名為TheliaMySQLModesChecker的模塊,它能夠自動修復Thelia所需的MySQL模式,徹底解決了我的困擾。

MySQL:結構化數據和關係數據庫 MySQL:結構化數據和關係數據庫 Apr 18, 2025 am 12:22 AM

MySQL通過表結構和SQL查詢高效管理結構化數據,並通過外鍵實現表間關係。 1.創建表時定義數據格式和類型。 2.使用外鍵建立表間關係。 3.通過索引和查詢優化提高性能。 4.定期備份和監控數據庫確保數據安全和性能優化。

MySQL:解釋的關鍵功能和功能 MySQL:解釋的關鍵功能和功能 Apr 18, 2025 am 12:17 AM

MySQL是一個開源的關係型數據庫管理系統,廣泛應用於Web開發。它的關鍵特性包括:1.支持多種存儲引擎,如InnoDB和MyISAM,適用於不同場景;2.提供主從復制功能,利於負載均衡和數據備份;3.通過查詢優化和索引使用提高查詢效率。

See all articles