执行一条sql
INSERT INTO audience.`test_float_decimal`(cost) VALUES(880960.08)
执行结果如下:
sql 语句里面是880960.08,插入的结果却不同???让我们带着疑问往下看!
首先,我们来快速重现一下问题,才有说服力:
- 建表语句 (cost字段为float类型)
CREATE TABLE `test_float_decimal` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`cost` FLOAT(11,2) DEFAULT NULL,
PRIMARY KEY (`id`)
)
- 插入数据
INSERT INTO audience.`test_float_decimal`(cost) VALUES(880960.08)
- 查看数据库插入的cost字段的数据(会发现数据异常)
很多时候,我们知道一些知识点,但是在自己开发需求的过程中,没有遇到过,就很难有比较深刻的理解,实数的类型有float,double,decimal,我相信大部分人都知道,看的时候,理解了知道了有这几种类型,但是很少会去建一个表,插入一条数据,查看它们的差异。恰巧开发遇到了,分享一下,记录一下
出现上述异常的原因:
1.mysql float占4个字节,double占8个字节,decimail(M,D)占M+2个字节
2.float类型的数据,只分配了32位的存储空间,对于double类型值分配了64位, 但是, 但是,并不是所有的实数都能转成32位或者64位的二进制形式, 如果超过了,就会出现截断,这就是误差的来源,上述例子就是实数过大导致我只是简答阐述一下,如果想了解更详尽的,点击下方链接 (懒癌晚期。。。)
http://yongxiong.leanote.com/post/mysql_float_double_decimal
哦,差点忘了.........
如果解决问题,把字段类型该为decimal就可以了
INSERT INTO audience.`test_float_decimal`(cost) VALUES(880960.08)