精华内容
下载资源
问答
  • 数据库浮点型Float的设计

    千次阅读 2017-05-11 16:07:02
    MySQL浮点型和定点型可以用类型名称后加(M,D)来表示,M表示该值的总共长度,D表示小数点后面的长度,M和D又称为精度和标度,如float(7,4)的可显示为-999.9999,MySQL保存值时进行四舍五入,如果插入999.00009,则...

    MySQL浮点型和定点型可以用类型名称后加(M,D)来表示,M表示该值的总共长度,D表示小数点后面的长度,M和D又称为精度和标度,如float(7,4)的可显示为-999.9999,MySQL保存值时进行四舍五入,如果插入999.00009,则结果为999.0001。FLOAT和DOUBLE在不指定精度时,默认会按照实际的精度来显示,而DECIMAL在不指定精度时,默认整数为10,小数为0。

    创建下表:
    mysql> CREATE TABLE t2(id1 FLOAT(5,2) DEFAULT NULL,id2 DOUBLE(5,2) DEFAULT NULL,id3 DECIMAL(5,2) DEFAULT NULL);

    mysql> DESC t2;
    +-------+--------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+--------------+------+-----+---------+-------+
    | id1 | float(5,2) | YES | | NULL | |
    | id2 | double(5,2) | YES | | NULL | |
    | id3 | decimal(5,2) | YES | | NULL | |
    +-------+--------------+------+-----+---------+-------+

    往id1,id2,id3这三个字段中插入数据1.23:

    mysql> INSERT INTO t2(id1,id2,id3) VALUES(1.23,1.23,1.23);

    mysql> SELECT * FROM t2;
    +------+------+------+
    | id1 | id2 | id3 |
    +------+------+------+
    | 1.23 | 1.23 | 1.23 |
    +------+------+------+

    数据都正确插入,再向id1插入1.234,id2插入1.234,id3仍然插入1.23:
    mysql> INSERT INTO t2(id1,id2,id3) VALUES(1.234,1.234,1.23);

    mysql> SELECT * FROM t2;
    +------+------+------+
    | id1 | id2 | id3 |
    +------+------+------+
    | 1.23 | 1.23 | 1.23 |
    | 1.23 | 1.23 | 1.23 |
    +------+------+------+

    数据全部正确插入,但是id1和id2由于标度的限制,舍去了最后一位。

    同时向id1,id2,id3中插入数据1.234:

    mysql> INSERT INTO t2(id1,id2,id3) VALUES(1.234,1.234,1.234);
    Query OK, 1 row affected, 1 warning (0.02 sec)
    mysql> SELECT * FROM t2;
    +------+------+------+
    | id1 | id2 | id3 |
    +------+------+------+
    | 1.23 | 1.23 | 1.23 |
    | 1.23 | 1.23 | 1.23 |
    | 1.23 | 1.23 | 1.23 |
    +------+------+------+
    3 rows in set (0.00 sec)

    数据也插入成功,但是有一个错误提示,

    mysql> SHOW warnings;
    +-------+------+------------------------------------------+
    | Level | Code | Message |
    +-------+------+------------------------------------------+
    | Note | 1265 | Data truncated for column 'id3' at row 1 |
    +-------+------+------------------------------------------+
    1 row in set (0.00 sec)

    将id1,id2,id3的精度和标度都去掉,再插入数据1.234:

    mysql> ALTER TABLE t2 MODIFY id1 FLOAT;
    Query OK, 0 rows affected (0.14 sec)
    Records: 0 Duplicates: 0 Warnings: 0

    mysql> ALTER TABLE t2 MODIFY id2 DOUBLE;
    Query OK, 0 rows affected (0.04 sec)
    Records: 0 Duplicates: 0 Warnings: 0

    mysql> ALTER TABLE t2 MODIFY id3 DECIMAL;
    Query OK, 4 rows affected, 4 warnings (0.06 sec)
    Records: 4 Duplicates: 0 Warnings: 4

    mysql> DESC t2;
    +-------+---------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+---------------+------+-----+---------+-------+
    | id1 | float | YES | | NULL | |
    | id2 | double | YES | | NULL | |
    | id3 | decimal(10,0) | YES | | NULL | |
    +-------+---------------+------+-----+---------+-------+

    mysql> INSERT INTO t2(id1,id2,id3) VALUES(1.234,1.234,1.234);
    Query OK, 1 row affected, 1 warning (0.00 sec)

    mysql> SHOW WARNINGS;
    +-------+------+------------------------------------------+
    | Level | Code | Message |
    +-------+------+------------------------------------------+
    | Note | 1265 | Data truncated for column 'id3' at row 1 |
    +-------+------+------------------------------------------+
    1 row in set (0.00 sec)

    mysql> SELECT * FROM t2;
    +-------+-------+------+
    | id1 | id2 | id3 |
    +-------+-------+------+
    | 1.234 | 1.234 | 1 |
    +-------+-------+------+
    1 row in set (0.00 sec)

    id1和id2的数据正确插入,而id3被截断。

    浮点数如果不写精度和标度,则会按照实际显示,如果有精度和标度,则会将数据四舍五入后插入,系统不报错,定点数如果不设置精度和标度,刚按照默认的(10,0)进行操作,如果数据超过了精度和标度值,则会报错。

    展开全文
  • 首先我们先来了解一下每个浮点类型的存储大小和范围,如下表:类型大小范围(有符号)范围(无符号)用途==float==4 bytes(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38...

    e1dbed873805d1ad9eea00a983addf27.png

    首先我们先来了解一下每个浮点类型的存储大小和范围,如下表:类型大小范围(有符号)范围(无符号)用途==float==4 bytes(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)0,(1.175 494 351 E-38,3.402 823 466 E+38)单精度 浮点数值

    ==double==8 bytes(-1.797 693 134 862 315 7 E+308,-2.225073858507 2014E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)双精度 浮点数值

    decimal对decimal(M,D) ,如果M>D,为M+2否则为D+2依赖于M和D的值依赖于M和D的值小数值

    那么MySQL中这三种都是浮点类型 它们彼此的区别又是什么呢 ??float 浮点类型用于表示单精度浮点数值

    double浮点类型用于表示双精度浮点数值

    这里肯定有些小伙伴要问了 什么是单精度? 什么是双精度 ?下面我们就来简单了解一下吧!

    首先,我们知道一个bytes(字节) 占8位 对吧!

    float单精度 存储浮点类型的话 就是 ==4x8=32位的长度== , 所以float单精度浮点数在内存中占 4 个字节,并且用 32 位二进制进行描述

    那么 double双精度 存储浮点类型就是 ==8x8 =64位的长度==, 所以double双精度浮点数在内存中占 8 个字节,并且用 64 位二进制进行描述 通过计算、那么64位就可以获得更多的尾数!

    尾数

    就是小数点后的有多少个数位。

    所以这里的精度主要取决于尾数部分的位数,所以根据IEEE二进制浮点数算术标准 来计算得出结论,如下:

    float单精度小数部分只能精确到后面6位,加上小数点前的一位,即有效数字为7位

    double双精度小数部分能精确到小数点后的15位,加上小数点前的一位 有效位数为16位。

    最后就区别出了小数点后边位数的长度,越长越精确!

    double 和 float 彼此的区别:

    在内存中占有的字节数不同, 单精度内存占4个字节, 双精度内存占8个字节

    有效数字位数不同(尾数) 单精度小数点后有效位数7位, 双精度小数点后有效位数16位

    数值取值范围不同 根据IEEE标准来计算!

    在程序中处理速度不同,一般来说,CPU处理单精度浮点数的速度比处理双精度浮点数快

    double 和 float 彼此的优缺点

    float单精度

    优点: float单精度在一些处理器上比double双精度更快而且只占用double双精度一半的空间

    缺点: 但是当值很大或很小的时候,它将变得不精确。

    double双精度

    优点: double 跟 float比较, 必然是 double 精度高,尾数可以有 16 位,而 float 尾数精度只有 7 位

    缺点: double 双精度是消耗内存的,并且是 float 单精度的两倍! ,double 的运算速度比 float 慢得多, 因为double 尾数比float 的尾数多, 所以计算起来必然是有开销的!

    如何选择double 和 float 的使用场景

    首先: 能用单精度时不要用双精度 以省内存,加快运算速度!

    float: 当然你需要小数部分并且对精度的要求不高时,选择float单精度浮点型比较好!

    double: 因为小数位精度高的缘故,所以双精度用来进行高速数学计算、科学计算、卫星定位计算等处理器上双精度型实际上比单精度的快, 所以: 当你需要保持多次反复迭代的计算精确性时,或在操作值很大的数字时,双精度型是最好的选择。

    说这么多其实就是小数点后面的保留位数多少的问题!

    小结

    float 表示的小数点位数少,double能表示的小数点位数多,更加精确!就这么简单 看情况自己选择吧!

    double和float 后面的长度m,d代表的是什么?

    double(m,d) 和float(m,d) 这里的m,d代表的是什么呢 ? 很多小伙伴也是不清不楚的! 我还是来继续解释一下吧

    其实跟前面整数int(n)一样,这些类型也带有附加参数:一个显示宽度m和一个小数点后面带的个数d

    比如: 语句 float(7,3) 规定显示的值不会超过 7 位数字,小数点后面带有 3 位数字 、double也是同理

    在MySQL中,在定义表字段的时候, unsigned和 zerofill 修饰符也可以被 float、double和 decimal数据类型使用, 并且效果与 int数据类型相同 跟上面一样这里就不多说了!

    小结

    在MySQL 语句中, 实际定义表字段的时候,float(M,D) unsigned中的M代表可以使用的数字位数,D则代表小数点后的小数位数, unsigned 代表不允许使用负数。

    double(M,D) unsigned 中的M代表可以使用的数字位数,D则代表小数点后的小数位数。

    注意:M>=D!

    decimal类型

    1.介绍decimal

    在存储同样范围的值时,通常比decimal使用更少的空间,float使用4个字节存储,double使用8个字节 ,而 decimal依赖于M和D的值,所以decimal使用更少的空间。

    在实际的企业级开发中,经常遇到需要存储金额(3888.00元)的字段,这时候就需要用到数据类型decimal。在MySQL数据库中,decimal的使用语法是:decimal(M,D),其中,M 的范围是1~65,D 的范围是0~30,而且D不能大于M。

    2.最大值

    数据类型为decimal的字段,可以存储的最大值/范围是多少?例如:decimal(5,2),则该字段可以存储-999.99~999.99,最大值为999.99。也就是说D表示的是小数部分长度,(M-D)表示的是整数部分长度。

    3.存储 [了解]

    decimal类型的数据存储形式是,将每9位十进制数存储为4个字节。(官方解释:Values for DECIMAL columns are stored using a binary format that packs nine decimal digits into 4 bytes)。

    那有可能设置的位数不是9的倍数,官方还给了如下表格对照:Leftover DigitsNumber of Bytes00

    1–21

    3–42

    5–63

    7–94

    表格什么意思呢,举个例子:

    1、字段decimal(18,9),18-9=9,这样整数部分和小数部分都是9,那两边分别占用4个字节;

    2、字段decimal(20,6),20-6=14,其中小数部分为6,就对应上表中的3个字节,而整数部分为14,14-9=5,就是4个字节再加上表中的3个字节

    所以通常我们在设置小数的时候,都是用的decimal类型!!

    案例1

    mysql> drop table temp2;

    Query OK, 0 rows affected (0.15 sec)

    mysql> create table temp2(id float(10,2),id2 double(10,2),id3 decimal(10,2));

    Query OK, 0 rows affected (0.18 sec)

    mysql> insert into temp2 values(1234567.21, 1234567.21,1234567.21),(9876543.21,-> 9876543.12, 9876543.12);

    Query OK, 2 rows affected (0.06 sec)

    Records: 2 Duplicates: 0 Warnings: 0mysql> select * from temp2;idid2id3

    1234567.251234567.211234567.21

    9876543.009876543.129876543.12

    2 rows in set (0.01 sec)mysql> desc temp2;FieldTypeNullKeyDefaultExtra

    idfloat(10,2)YESNULL

    id2double(10,2)YESNULL

    id3decimal(10,2)YESNULL

    3 rows in set (0.01 sec)

    案例2

    mysql> drop table temp2;

    Query OK, 0 rows affected (0.16 sec)

    mysql> create table temp2(id double,id2 double);

    Query OK, 0 rows affected (0.09 sec)

    mysql> insert into temp2 values(1.235,1,235);

    ERROR 1136 (21S01): Column count doesn't match value count at row 1

    mysql> insert into temp2 values(1.235,1.235);

    Query OK, 1 row affected (0.03 sec)

    mysql>mysql> select * from temp2;idid2

    1.2351.235

    1 row in set (0.00 sec)

    mysql> insert into temp2 values(3.3,4.4);

    Query OK, 1 row affected (0.09 sec)mysql> select * from temp2;idid2

    1.2351.235

    3.34.4

    2 rows in set (0.00 sec)mysql> select id-id2 from temp2;id-id2

    0

    -1.1000000000000005

    2 rows in set (0.00 sec)

    mysql> alter table temp2 modify id decimal(10,5);

    Query OK, 2 rows affected (0.28 sec)

    Records: 2 Duplicates: 0 Warnings: 0

    mysql> alter table temp2 modify id2 decimal(10,5);

    Query OK, 2 rows affected (0.15 sec)

    Records: 2 Duplicates: 0 Warnings: 0mysql> select * from temp2;idid2

    1.235001.23500

    3.300004.40000

    2 rows in set (0.00 sec)mysql> select id-id2 from temp2;id-id2

    0.00000

    -1.10000

    2 rows in set (0.00 sec)

    展开全文
  • 浮点型精度

    2010-07-22 22:48:58
    找了下资料,浮点型运算基本按照IEEE-754格式标准,FLOAT是由4个字节(32位)组成: SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM S: 第一位:表示浮点数正负,1为负数,0为正数E: 指数加上127后的...

    今天一同事发现,往数据库插入一字段值为400000.18,库中变成400000.19,字段为float类型。(以下讨论皆针对单精度浮点)

     

    找了下资料,浮点型运算基本按照IEEE-754格式标准,FLOAT是由4个字节(32位)组成:

    SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM

    S: 第一位:表示浮点数正负,1为负数,0为正数
    E: 指数加上127后的值的二进制数
    M: 24-bit的底数(由于符号位已经由S标识了,只存储23-bit)

     

    按照上图,浮点型最多只能精确2^23内的整数,但由于IEEE754标准对底数格式作了规范:即二进制的1.xxxxx,因此底数小数点左面部分总是1,在这里,为了提高精度,把1省略了,因此实际上最多能精确到2^24-1(即16777215)内的整数。由此可见,整数最大可保证精度为7位。

     

    至于带小数的处理,由于小数位与整数位是分开计算,而且由于小数位独特的转二进制方法,可能存在无限循环,决定了浮点的小数位无法做到100%精确,使带小数的浮点精度更低。直到现在,我还不解为何转二进制采用乘2取整如此独特的方法,正是因为这种方法导致小数位无法像整数位一般精确。

     

    结论:单精度浮点最大可保证精度是7位(xxxxx.xx),JAVA中的浮点型,如果需要7位数值以上的精确度,就换成BigDecimal(推荐)或double型(52bit底数,15位精确度),在MYSQL中则推荐采用DECIMAL(x,y)。

     

    标准参考:http://en.wikipedia.org/wiki/IEEE_754-2008

    展开全文
  • test1: test2: test3: 所以在很要求精度的应用中,一定要用BigDecimal的String构造器而一般数据库存储的都是double类型,所以就可以写一个BigDecimal的工具类,方便转换public class BigDecimalUtil {private ...

    test1:

    fc8082cd74ade6bfa833aad184e7152b.png

    test2:

    8947cf941953c3b4824cb27e220b60c1.png

    test3:

    5d216bc4260a05bea7270a822a388930.png

    所以在很要求精度的应用中,一定要用BigDecimal的String构造器

    而一般数据库存储的都是double类型,所以就可以写一个BigDecimal的工具类,方便转换

    public class BigDecimalUtil {

    private BigDecimalUtil(){

    }

    public static BigDecimal add(double d1, double d2){

    BigDecimal b1 = new BigDecimal(Double.toString(d1));

    BigDecimal b2 = new BigDecimal(Double.toString(d2));

    return b1.add(b2);

    }

    public static BigDecimal sub(double d1, double d2){

    BigDecimal b1 = new BigDecimal(Double.toString(d1));

    BigDecimal b2 = new BigDecimal(Double.toString(d2));

    return b1.subtract(b2);

    }

    public static BigDecimal mul(double d1, double d2){

    BigDecimal b1 = new BigDecimal(Double.toString(d1));

    BigDecimal b2 = new BigDecimal(Double.toString(d2));

    return b1.multiply(b2);

    }

    //要注意除不尽的情况

    public static BigDecimal div(double d1, double d2){

    BigDecimal b1 = new BigDecimal(Double.toString(d1));

    BigDecimal b2 = new BigDecimal(Double.toString(d2));

    //保留两位小数,四舍五入

    return b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP);

    }

    }

    展开全文
  • test1: test2: test3: ...而一般数据库存储的都是double类型,所以就可以写一个BigDecimal的工具类,方便转换 public class BigDecimalUtil { private BigDecimalUtil(){ } public s...
  • double转换为int以及浮点型相加损失精度问题 最近在做支付相关模块的业务,数据库字段却使用的是double类型,其实也行,只要计算不在sql语句中进行,也是没有问题的。 预先的类属性设置的是Double...
  • Decimal为SQL Server、MySql等数据库的一种数据类型,不属于浮点数类型,可以在定义时划定整数部分以及小数部分的位数。使用精确小数类型不仅能够保证数据计算更为精确,还可以节省储存空间,例如百分比使用decimal...
  • 精度精度 定点数 decimal是定点类型 3.整型 与C语言整型差不多 unsigned zerofill bool是tinyint(1)的别名 tinyint[M] [unsigned] [zerofill] 这里的M表示显式宽度 测试:宽度不足4位,前导用0来填充 ...
  • 最近公司某小伙子做了一个商城的微信支付相关的接口,其中包含退款,在测试过程中发现部分单据没有退款,微信支付提示退款金额跟支付金额不匹配(大于支付金额),检查数据库和调试过程中,发现商品的单价和手工计算...
  • 问题:在使用mysql数据库的时候【Float类型生成的长度和精度均为0】,不管是直接操作mysql还是使用SQLAlchemy的filter条件查询浮点数都是如此! # 查询price字段【定义为Float类型】导致查询==条件的时候失败 ...
  • 在使用flask_sqlachemy时,给price字段选择了Float类型,数据库用的mysql,生成数据库表后,发现 from sqlalchemy import Float,Column price = Column(Float,default=0.00) 虽然能存储float类型,结果...
  • 今天在用MySql数据库开发时遇到了下面的问题: SQL:select sum(money) from TABLE 结果:1482.7999999999997300000000000000000 期望:1482.8 Google一下发现可能是由于MySql内部精度运算的问题(又有高人例证是...
  • MySQL数据库支持的数字类型,主要包括整型、浮点型、高精度型、位类型等类型。一、整型MySQL数据库支持SQL标准支持的整型类型:INT、SMALLINT。此外MySQL数据库也支持诸如TINYINT、MEDIUMINT和BIGINT等类型。下表...
  • 数据库基础

    2018-01-08 10:01:00
    数据库基础: ...单精度浮点型:float 双精度浮点型:double 字符:char(长度) 字符串:varchar(长度) 日期:date 日期时间:datetime 小数:decimal 文本:text 添加主键(必须添加): 主键:唯一...
  • 浅学Oracles数据库

    2020-07-18 10:24:31
    * float 单精度浮点型 * double 双精度浮点型 * char 字符型【长度不可变】 * varchar 字符型【长度可变】 * date 日期类型 * blob 二进制大对象【Binary Large OBject, 存储图片、声音、...
  • mysql数据库基础

    2017-03-27 09:25:58
    MySQL数据库数据库存储数据结构:库Database表Table字段Colmun记录Record数据类型:数值型INT, TINYINT, SMALL INT, MEDIUM INT, BIG INTINT UNSIGNED无符号整型DECIMAL精确数字FLOAT单精度浮点型DOUBLE双精度浮点型...
  • 浮点列与定点列

    2019-01-27 16:45:07
    浮点型(float 和 double)MySQL数据类型含义float(m,d)单精度浮点型 8位精度(4字节) m总个数,d小数位double(m,d)双精度浮点型 16位精度(8字节) m总个数,d小数位注释:设一个字段定义为 float(5,3),如果插入一个数 ...
  • sql server 2008 数据库数据类型 一、数值型 int:整数类型,它的精度由执行机构...float:浮点型数值型,其精度等于或大于给定的精度p。 eral:浮点数值型,它的精度由执行机构确定。。 double:双精度浮点型,...
  • 数据库常用数据类型

    2020-08-16 16:21:46
    浮点型 4字节浮点数,范围约+/-1038 DOUBLE 浮点型 8字节浮点数,范围约+/-10308 DECIMAL(M,N) 高精度小数 由用户指定精度的小数,例如,DECIMAL(20,10)表示一共20位,其中小数10位,通常用于
  • 1,浮点型:在数据库中存放的是近似值 float(m,d)单精度浮点型,8位精度(4字节),m是十进制数字的总个数,d是小数点后面的数字个数 double(m,d)双精度浮点型,16位精度(8字节),m是十进制数字的总个数,d是小数点后面...
  • 数据库数据类型

    2017-11-12 23:24:00
    Mysql里类型有:整数型,浮点型,日期和时间类型,字符串类型等,不同的数据类型其特点与使用范围也不同 整数类型是数据库中最基本的类型 浮点数类型包括单精度浮点数(float)和双精度浮点数(double) ...
  • MySQL数据库存储数据结构: 库 Database 表 Table 字段 Colmun 记录 Record 数据类型: 数值型 INT, TINY INT, SMALL INT, MEDIUM INT, BIG INT  ...FLOAT 单精度浮点型 DOUBLE 双精度浮点型
  • 关系数据库入门

    2021-01-31 23:11:33
    文本和字符串类型 text — 任何长度的字符串,例如 Python str 或 unicode 类型。...double precision — 精度更高的浮点型值。精确到小数点后 15 位。 decimal — 精确的十进制值。 日期和时间类型 dat
  • 在后端开发中,数据库MySQL我以前经常使用float和double来存储浮点型数据,但现在发现很多的精度丢失问题。 现在来看看他们的区别 float 类型用于表示单精度浮点数值,而double类型用于表示双精度浮点数值,...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 156
精华内容 62
关键字:

数据库浮点型精度