執(zhí)行一條sql
INSERT INTO audience.`test_float_decimal`(cost) VALUES(880960.08)
執(zhí)行結(jié)果如下:
sql 語句里面是880960.08纬纪,插入的結(jié)果卻不同揍移??呆盖?讓我們帶著疑問往下看拖云!
首先,我們來快速重現(xiàn)一下問題,才有說服力:
- 建表語句 (cost字段為float類型)
CREATE TABLE `test_float_decimal` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`cost` FLOAT(11,2) DEFAULT NULL,
PRIMARY KEY (`id`)
)
- 插入數(shù)據(jù)
INSERT INTO audience.`test_float_decimal`(cost) VALUES(880960.08)
- 查看數(shù)據(jù)庫插入的cost字段的數(shù)據(jù)(會發(fā)現(xiàn)數(shù)據(jù)異常)
很多時候应又,我們知道一些知識點宙项,但是在自己開發(fā)需求的過程中,沒有遇到過株扛,就很難有比較深刻的理解尤筐,實數(shù)的類型有float,double,decimal,我相信大部分人都知道,看的時候洞就,理解了知道了有這幾種類型盆繁,但是很少會去建一個表,插入一條數(shù)據(jù)旬蟋,查看它們的差異油昂。恰巧開發(fā)遇到了,分享一下,記錄一下
出現(xiàn)上述異常的原因:
1.mysql float占4個字節(jié)冕碟,double占8個字節(jié)拦惋,decimail(M,D)占M+2個字節(jié)
2.float類型的數(shù)據(jù),只分配了32位的存儲空間安寺,對于double類型值分配了64位厕妖, 但是, 但是,并不是所有的實數(shù)都能轉(zhuǎn)成32位或者64位的二進(jìn)制形式挑庶, 如果超過了叹放,就會出現(xiàn)截斷,這就是誤差的來源挠羔,上述例子就是實數(shù)過大導(dǎo)致我只是簡答闡述一下井仰,如果想了解更詳盡的,點擊下方鏈接 (懶癌晚期破加。俱恶。。)
http://yongxiong.leanote.com/post/mysql_float_double_decimal
哦范舀,差點忘了.........
如果解決問題合是,把字段類型該為decimal就可以了
INSERT INTO audience.`test_float_decimal`(cost) VALUES(880960.08)