美文网首页
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