美文网首页
mysql : float,double,decimal

mysql : float,double,decimal

作者: torrent_lsl | 来源:发表于2019-07-23 11:10 被阅读0次
执行一条sql
INSERT INTO audience.`test_float_decimal`(cost) VALUES(880960.08)
执行结果如下:
image.png
sql 语句里面是880960.08,插入的结果却不同???让我们带着疑问往下看!
首先,我们来快速重现一下问题,才有说服力:
  1. 建表语句 (cost字段为float类型)
CREATE TABLE `test_float_decimal` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `cost` FLOAT(11,2) DEFAULT NULL,
  PRIMARY KEY (`id`)
)
  1. 插入数据
INSERT INTO audience.`test_float_decimal`(cost) VALUES(880960.08)
  1. 查看数据库插入的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)
执行结果如下:
image.png

相关文章

网友评论

      本文标题:mysql : float,double,decimal

      本文链接:https://www.haomeiwen.com/subject/owkglctx.html