float,double,decimal區別
創建表test_float_double_decimal
CREATE TABLE `test_float_double_decimal` (
`id` int(11) NOT NULL COMMENT 'id',
`float7.4` float(7,4) NOT NULL,
`float255.30` float(255,30) NOT NULL,
`double15.4` double(15,4) NOT NULL,
`double255.30` double(255,30) NOT NULL,
`decimal10.4` decimal(10,4) NOT NULL,
`decimal65.30` decimal(65,30) NOT NULL,
`float_default` float NOT NULL,
`double_default` double NOT NULL,
`decimal_default` decimal(10,0) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `test_float_double_decimal`(`float7.4`, `float255.30`, `double15.4`, `double255.30`, `decimal10.4`, `decimal65.30`, `float_default`, `double_default`, `decimal_default`) VALUES (789.123456789,123456789.123456789,123456789.123456789,123456789.123456789,789.123456789,123456789.123456789,123456789.123456789,123456789.123456789,123456789.123456789);
INSERT INTO `test_float_double_decimal`(`float7.4`, `float255.30`, `double15.4`, `double255.30`, `decimal10.4`, `decimal65.30`, `float_default`, `double_default`, `decimal_default`) VALUES (789.123456789,12345678987654321.12345678987654321,12345678987.12345678987654321,12345678987654321.12345678987654321,789.12345678987654321,12345678987654321.12345678987654321,12345678987654321.12345678987654321,12345678987654321.12345678987654321,1234567898.12345678987654321);
第一條數據插入后,float都跑偏了,double還算正常(最后位值四舍五入),decimal正常(最后位值四舍五入)。
第二條數據插入后發現,float跑偏最嚴重,double也開始有些跑偏。decimal最正常。
decimal詳情
decimal(a,b)
參數說明
a指定指定小數點左邊和右邊可以存儲的十進制數字的最大個數,默認是10,最大精度65。
b指定小數點右邊可以存儲的十進制數字的最大個數。小數位數必須是從 0 到 a之間的值。默認小數位數是 0,最大值為30。
備注
DECIMAL數據類型用於要求非常高的精確度的計算中,這些類型允許指定數值的精確度和計數方法作為選擇參數。精確度在這里是指為這個值保存的有效數字的總個數,而計數方法表示小數點后數字的個數。例如,語句DECIMAL (5,2)規定了存儲的值將不會超過5位數字,開且小數點后面有2位數字。
總結:像坐標,錢這樣的數據,對於精度要求高的,可以采用decimal來進行存儲。
decimal(10,2) 表示錢,decimal(10,6)可以表示坐標。
項目中的數據表中存儲坐標,使用了float,結果如下。
數據都丟失了,本來后面是6位小數的,經過上面的實驗總結,適合改為使用decimal來進行存儲,double也還可以,不過需要設置好位數。