float 的資料格式是以近似值的方式而不是以確實的表示法儲存數字,也就是假設我們輸入100,但對浮點數來說有可能是99.9999999999999999998非常接近100,但不是真正的100。


float的坑

這個在一般使用下可能感受不出差異,但在某些特別的情況下就會出現預期之外的結果。

像是Aidec自己就遇到在SQL中使用SUM這個函數去計算加總,其正確結果應為0,但卻出現一個非常奇怪的數字。


1517364209346.jpg


解決之道

若要解決這個錯誤其實也很簡單,那就是不用使用float最為資料的儲存格式,而是改用decimal


使用decimal的話,資料儲存格式就會以精準的值,作為實際儲存值。假如我們儲存的資料整數長度最多8位數且有2個小數點,那我們可以設為 decimal(10,2)


格式範例


Decimal(p,s)


p:為總長度 (整數位數+小數點位數)

s:為小數點位數


範例

Decimal(4,3) => 9.999  

Decimal(6,2)=>999999.99

Decimal(10,2)=>99999999.99


文章轉載或引用,請先告知並保留原文出處與連結!!(單純分享或非營利的只需保留原文出處,不用告知)

原文連結:
https://blog.aidec.tw/post/mysql-float-decimal