原文链接:https://blog.csdn.net/weixin_42047611/article/details/81449663

MySQL 中使用浮点数和定点数来表示小数。

浮点类型有两种,分别是单精度浮点数(FLOAT)和双精度浮点数(DOUBLE);定点类型只有一种,就是 DECIMAL

浮点类型和定点类型都可以用(M, D)来表示,其中M称为精度,表示总共的位数;D称为标度,表示小数的位数。

浮点数类型的取值范围为 M(1~255)和 D(1~30,且不能大于 M-2),分别表示显示宽度和小数位数。M 和 D 在 FLOAT 和DOUBLE 中是可选的,FLOAT 和 DOUBLE 类型将被保存为硬件所支持的最大精度。DECIMAL 的默认 D 值为 0、M 值为 10。

下表中列出了 MySQL 中的小数类型和存储需求。

类型名称 说明 存储需求
FLOAT 单精度浮点数 4 个字节
DOUBLE 双精度浮点数 8 个字节
DECIMAL (M, D),DEC 压缩的“严格”定点数 M+2 个字节

DECIMAL 类型不同于 FLOAT 和 DOUBLE。DOUBLE 实际上是以字符串的形式存放的,DECIMAL 可能的最大取值范围与 DOUBLE 相同,但是有效的取值范围由 M 和 D 决定。如果改变 M 而固定 D,则取值范围将随 M 的变大而变大。

从上表中可以看到,DECIMAL 的存储空间并不是固定的,而由精度值 M 决定,占用 M+2 个字节。

FLOAT 类型的取值范围如下:

  • 有符号的取值范围:-3.402823466E+38~-1.175494351E-38。
  • 无符号的取值范围:0 和 -1.175494351E-38~-3.402823466E+38。

DOUBLE 类型的取值范围如下:

  • 有符号的取值范围:-1.7976931348623157E+308~-2.2250738585072014E-308。
  • 无符号的取值范围:0 和 -2.2250738585072014E-308~-1.7976931348623157E+308。

提示:不论是定点还是浮点类型,如果用户指定的精度超出精度范围,则会四舍五入进行处理。

FLOAT 和 DOUBLE 在不指定精度时,默认会按照实际的精度(由计算机硬件和操作系统决定),DECIMAL 如果不指定精度,默认为(10,0)。

浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的范围;缺点是会引起精度问题。

最后再强调一下:在 MySQL 中,定点数以字符串形式存储,在对精度要求比较高的时候(如货币、科学数据),使用 DECIMAL 的类型比较好,另外两个浮点数进行减法和比较运算时也容易出问题,所以在使用浮点数时需要注意,并尽量避免做浮点数比较。

我们在Mysql中存字段的时候,比如,一些与金钱有关的数据。这个时候就会对精确到的要求非常高。那么这个时候,就会发现我们之前所学的八大基本类型不再能够满足需求,无论是整形还是浮点型,有人会说存整形有什么不可,但是你要知道不是每个人的金额都是整数的;这样不行的话,存浮点型的就可以了嘛,对于银行存钱来说,一个小数点的问题都会将一笔钱的金额变得很大或者很小......So,这个时候你可以尝试一下Decimal类型,你会发现能够很好地解决你的问题。

decimal详细介绍:
   decimal(a,b)

参数说明:

a:指定小数点左边和右边可以存储的十进制数字的最大个数,最大精度为38.

b:指定小数点右边可以存储的十进制数字的最大个数。小数位数必须是从0~a之间的值,默认小数位数是0.

举例说明,11615.23653234568这个数存你说的三个格式
                   decimal:11615
                   decimal(3):999
                   decdimal(3,2):9.99
                   decimal(10,5)11615.23653
         超出精度范围的数会被强制进位并只显示数据类型定义的格式

备注:

decimal数据类型用于要求非常高的精确计算中,这些类型允许指定数值的精确度和计算方法作为选择参数。精确度在这里指为这个值保存的有效数字的总个数。而计数方法指的是小数点后数字的个数。例如:decimal(5,2)规定了存储的值将不会超过五位数字 ,而且小数点后面有两位数字。

实例1:

 mysql> create table t1(c1 float(10,2), c3decimal(10,2)); 

         Query OK, 0 rows affected (0.02 sec)
         mysql> insert into t1 values(9876543.21, 9876543.12);                             Query OK, 1 row affected (0.00 sec)
         mysql> select * from t1;                                  +----------------+----------------+          | c1                | c3          |          +----------------+----------------+          | 9876543.00 | 9876543.12 |          +----------------+-----------------+         2 rows in set (0.00 sec)

会发现,flocat类型的字段会自动将值四舍五入,而decimal类型的不会,如果用flocat类型的去存与金额有关的数据的时候就会出现问题,而decimal类型的就不会。

    实例2:decimal(5,2)

mysql> create table t1(id1 float(5,2) default null,id2 double(5,2) default null,
id3 decimal(5,2) default null ); mysql> insert into t1 values(1.2345,1.2345,1.2345);
Query OK, 1 row affected, 1 warning (0.04 sec) mysql> show warnings;
+-------+------+------------------------------------------+
| Level | Code | Message |
+-------+------+------------------------------------------+
| Note | 1265 | Data truncated for column 'id3' at row 1 |
+-------+------+------------------------------------------+
1 row in set (0.00 sec)

1.2345 --- 小数点后最多2位,所以保存可以,自动四舍五入数据截断,但会报waning

12.34 --- OK

1234.5 --- 因为小数部分未满2位,要补0.所以保存应该1234.50。所以整个位数超出了5,保存报错。

1.2 --- 小数未满部分补0。按照1.20保存。

默认状态比较:

浮点数如果不写精度和标度,会按照实际精度值保存,如果有精度和标度,则会自动将四舍五入后的结果插入,系统不会报错;定点数如果不写精度和标度,则按照默认值decimal(10,0)来操作,如果数据超过了精度和标度值,系统会报错。

mysql小数类型的更多相关文章

  1. MySQL (二)-- 数据类型(列类型)、数值类型、 小数类型、 时间日期类型、 字符串类型 、 MySQL记录长度、列属性

    1 数据类型(列类型) 所谓的数据类型:对数据进行统一的分类,从系统的角度出发是为了能够使用统一的方式进行管理,更好的利用有限的空间. SQL中将数据类型分成了三大类: 2 数值类型 数值类型数据:都 ...

  2. MySQL数字类型中的三种常用种类

    数字类型 MySQL数字类型按照我的分类方法分为三类:整数类.小数类和数字类. MySQL数字类型之一我所谓的“数字类” 就是指 DECIMAL 和 NUMERIC,它们是同一种类型.它严格的说不是一 ...

  3. mysql索引总结(1)-mysql 索引类型以及创建

    mysql索引总结(1)-mysql 索引类型以及创建 mysql索引总结(2)-MySQL聚簇索引和非聚簇索引 mysql索引总结(3)-MySQL聚簇索引和非聚簇索引 mysql索引总结(4)-M ...

  4. (转)MySQL字段类型详解

    MySQL字段类型详解 原文:http://www.cnblogs.com/100thMountain/p/4692842.html MySQL支持大量的列类型,它可以被分为3类:数字类型.日期和时间 ...

  5. Mysql 数值类型

    Mysql数值类型 整数型 小数型(浮点数) 日期时间型

  6. 06、MySQL—列类型

    1.整数类型 I.有符号整型 (1) Tinyint:单字节整形,系统采用一个字节来保存的整形:一个字节 = 8位,最大能表示的数值是0-255. (2) Smallint:双字节整形,系统采用两个字 ...

  7. mysql float类型详解

    mysql float类型详解float类型长度必须设置3以上 不然会报错 out of range如果设置3 就只是 整数+小数的长度 比方说3.23 3.2等等 3.333就不行了 4位了

  8. 转:mysql datetime类型精确到毫秒、微秒的问题

    原文地址:mysql datetime类型精确到毫秒.微秒的问题 mysql里面的datetime类型的精确度是可以到1/ 10 ^ 6 秒的某些客户端(如navicat for mysql)的显示经 ...

  9. MySql 字段类型对应 Java 实体类型

    前言 MySQL Connector/J 对于 MySql 数据类型和 Java 数据类型之间的转换是很灵活的: 一般来讲,任何 MySql 数据类型都可以被转换为一个 java.lang.Strin ...

随机推荐

  1. Java并发(3)

    线程安全: 允许被多个线程同时执行的代码称作线程安全的代码.线程安全的代码不包含竞态条件.当多个线程同时更新共享资源时会引发竞态条件.因此,了解Java线程执行时共享了什么资源很重要. 局部变量: 局 ...

  2. Java——日期获取和日期格式化

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...

  3. javascript代码重构需要考虑的问题(一)

    1.将数组的长度进行存储,循环时就不用每次去读取一次数组长度,从而提升性能 例如: for (var i = 0, len = arr.length; i < len; i++) { //do ...

  4. Mac配置Jenkins(构建Allure模板报告)

    通过jenkins.pkg程序安装 1.修改环境配置 编辑 vi ~/.bash_profile,添加命令别名: alias jk_start="sudo launchctl load /L ...

  5. Mac下搭建atx2环境

    Git-atx2官网地址,默认已有python3环境 1.安装rethinkdb 安装db:mac上安装很简单,执行brew install rethinkdb 启动db:nohup rethinkd ...

  6. Linux学习(一):常用命令

    init 0:关机 init 3:命令行模式 init 5:图形界面模式 init 6:重启 shutdown -h now:立马关机 ls:文件列表 参数:-l 详细列表 cd:切换目录 用法实例: ...

  7. java第十三周课后作业 0529

    1.把多个企鹅的信息添加到集合中查看企鹅的数量及所有企鹅的信息删除集合中部分企鹅的元素判断集合中是否包含指定企鹅 package homework; import java.util.ArrayLis ...

  8. BFC与优雅降级 渐进增强——学习笔记

    BFC(块级格式化上下文) BFC(Block formatting context) 直译为"块级格式化上下文". 元素的显示模式 我们前面讲过 元素的显示模式 display. ...

  9. Spring boot Sample 0010之spring-boot-web-freemarker

    一.环境 1.1.Idea 2020.1 1.2.JDK 1.8 二.目的 spring boot 整合freemarker模板开发web项目 三.步骤 3.1.点击File -> New Pr ...

  10. 使用turtle库画太极图

    from turtle import * pensize(3) penup() pencolor("black") reset() speed(10) pendown() circ ...