面試官最愛問的坑:MySQL 中 FLOAT 和 DOUBLE 你真懂嗎?
大家好呀,我是小米,今年31歲,一個依舊熱衷折騰數據庫和分享技術的大哥哥。今天要跟大家聊一個在 MySQL社招面試里特別常見的問題:
FLOAT和DOUBLE的區別到底是什么?
別以為這是個“背誦定義”的小問題,面試官隨便一追問,很多候選人就“翻車”了。今天我就用一個小故事,把這件事掰開揉碎給大家講清楚,保證你下次遇到相關問題時,不僅能答,還能答得漂亮!
面試開場:靈魂一問
故事要從我朋友阿輝的面試說起。
那天他去一家互聯網公司面試,面試官剛寒暄了幾句,就突然拋出一句:
“阿輝,那你說說,MySQL里FLOAT和DOUBLE有什么區別?”
阿輝心里一緊,嘴里卻條件反射地冒出:“FLOAT是單精度,DOUBLE是雙精度啊。”
面試官點點頭,追問:“那你能具體講講,它們在 MySQL8.x 中各自存儲空間、精度表現、使用場景上有什么差別嗎?如果我要存貨幣數據,你覺得該用哪個?”
阿輝:“呃……這個……我記得FLOAT是4字節,DOUBLE是8字節吧,具體精度差多少我忘了,存貨幣的話……是不是用DOUBLE?”
面試官笑了笑,沒說話。阿輝的心涼了一半。
知識點拆解:FLOAT和DOUBLE的區別
我當時聽完阿輝復盤,差點沒笑噴。其實他沒答錯,但答得太淺了。
面試官真正想聽的,是以下幾個層次:
1. 存儲空間
- FLOAT:單精度浮點數,占 4字節(32位)。
- DOUBLE:雙精度浮點數,占 8字節(64位)。
MySQL8.x 官方文檔明確寫了,DOUBLE 是 FLOAT 的精度擴展版。
2. 精度
- FLOAT:大約能保證 7位十進制有效數字。
- DOUBLE:大約能保證 15~16位十進制有效數字。
換句話說,FLOAT能表示的數不如DOUBLE精確,尤其在做科學計算、金融數據統計時,誤差可能被放大。
3. 存儲方式
這兩個字段都是遵循 IEEE 754 標準 的浮點數表示方式。
內部是“符號位 + 指數位 + 尾數位”的結構,而不是直接存小數。
這也是為什么很多人用FLOAT/DOUBLE存貨幣會翻車的原因:
比如 0.1 + 0.2 在浮點數表示里,結果并不是等于 0.3,而是 0.30000000000000004。
4. 范圍
- FLOAT:±1.17549e-38 到 ±3.40282e38
- DOUBLE:±2.22507e-308 到 ±1.79769e308
DOUBLE 的表示范圍更大,適合高精度科學計算。
5. 顯示精度
MySQL5.x 曾經支持寫法:FLOAT(M,D) 或 DOUBLE(M,D)
- M = 總位數
- D = 小數位數
但在 MySQL 8.0.17 之后,這種寫法被棄用了,因為它容易讓人誤解精度,官方推薦用 DECIMAL 來控制小數點位數。
案例演示:誤差現場
有些人聽到這里可能還沒直觀感受,我來給大家舉個例子。
假設有一個商品價格,19.99 元,你用FLOAT存,結果可能會發生什么?
圖片
結果有可能顯示成:19.989999771118
而如果你用DOUBLE:
圖片
結果可能顯示成:19.990000000000002
是不是傻眼了?你以為的 19.99,數據庫卻“偷偷改造”了一下。
這就是浮點數的誤差問題!
面試官的陷阱:貨幣到底用哪個?
我敢打賭,很多面試官問FLOAT和DOUBLE,其實最后都會拋出終極問題:
“如果要存貨幣數據,用FLOAT還是DOUBLE?”
正確答案其實是:都不用!
貨幣數據一定要用 DECIMAL(M,D),因為DECIMAL是定點數,用字符串存儲并計算,能保證十進制精度,不會出現浮點誤差。
比如:
圖片
這樣存儲 19.99,才會保證無誤差。
所以答題套路就是:
- 先答FLOAT和DOUBLE的區別。
- 再補充說明浮點數存貨幣會出問題。
- 最后推薦用DECIMAL,這樣面試官一定覺得你“考慮全面”。
常見坑點總結
為了防止大家踩坑,我把FLOAT和DOUBLE的典型問題總結下:
- 精度不足:FLOAT常常丟精度,DOUBLE雖然更好,但也不是絕對精確。
- 計算誤差:浮點數運算存在四舍五入、進位問題。
- 顯示差異:存進去的數和查詢出來的數可能“肉眼不一樣”。
- 不適合貨幣:財務類應用必須用DECIMAL。
- 兼容性問題:某些語言(如Java、Python)取MySQL浮點數時,會遇到二進制轉十進制的小數問題,要特別小心。
我和阿輝的復盤
面試結束后,阿輝愁眉苦臉跑來找我:“小米,你快救救我,我感覺FLOAT和DOUBLE把我坑慘了!”
我笑著拍拍他:“兄弟,你其實沒答錯,只是答得太淺。下次你這樣答:
- FLOAT是4字節單精度,DOUBLE是8字節雙精度;
- FLOAT大約7位有效數字,DOUBLE能到15-16位;
- 存儲方式遵循IEEE 754,存在誤差問題;
- 范圍DOUBLE更大;
- 存貨幣數據應該用DECIMAL。
保證面試官立刻滿意地點頭,還可能反問一句:‘喲,你還挺懂行的嘛。’”
阿輝聽完,恍然大悟:“原來這才是面試標準答案啊!”
擴展思考
其實,FLOAT和DOUBLE的問題背后,考察的是候選人對計算機存儲和精度問題的理解。
很多人光背概念,一追問就露怯。面試官真正想確認的是:
- 你能不能把知識點說到位?
- 你能不能結合實際場景給出合適的方案?
- 你有沒有意識到工程上的坑?
說白了,能從“定義層面”上升到“應用層面”,才是真正的技術深度。
總結
好了,今天的故事就講到這里,我們來收個尾:
1、FLOAT vs DOUBLE
- FLOAT:單精度,4字節,7位有效數字。
- DOUBLE:雙精度,8字節,15-16位有效數字。
2、區別
- 存儲空間不同。
- 精度范圍不同。
- 都會有誤差,不適合存貨幣。
3、最佳實踐
- 科學計算:用DOUBLE。
- 財務數據:用DECIMAL。
- 需要存儲大范圍但允許誤差:FLOAT也可。
所以,下次面試官再問你FLOAT和DOUBLE的區別時,別只回答“單精度 vs 雙精度”,一定要補充 存儲空間、精度、范圍、應用場景、坑點,再順帶提一句“貨幣要用DECIMAL”,妥妥加分!
































