MySQL中的float和decimal类型有啥区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL中的float和decimal类型有啥区别相关的知识,希望对你有一定的参考价值。

decimal 类型可以精确地表示非常大或非常精确的小数。大至 1028(正或负)以及有效位数多达 28 位的数字可以作为 decimal类型存储而不失其精确性。该类型对于必须避免舍入错误的应用程序(如记账)很有用。

float是浮点数,不能指定小数位。
decimal是精确数,可以指定精度。
mysql 5来说 decimal(p,s)中p最大为65,S最大为30
decimal数据类型最多可存储 38 个数字,它存储了一个准确(精确)的数字表达法,不存储值的近似值。

当数据值一定要按照指定精确存储时,可以用带有小数的decimal数据类型来存储数字。
float和real数据类型被称为近似的数据类型。不存储精确值.当要求精确的数字状态时,比如在财务应用程序中,在那些需要舍入的操作中,或在等值核对的操作中,就不使用这些数据类型。这时就要用integer、decimal、money或smallmone数据类型。

在 WHERE 子句搜索条件中(特别是 = 和 <> 运算符),应避免使用float或real列。最好限制使用float和real列做> 或 < 的比较。

float,double容易产生误差,对精确度要求比较高时,建议使用decimal来存,decimal在mysql内存是以字符串存储的,用于定义货币要求精确度高的数据。在数据迁移中,float(M,D)是非标准定义,最好不要这样使用。M为精度,D为标度。
参考技术A decimal 类型可以精确地表示非常大或非常精确的小数。大至 1028(正或负)以及有效位数多达 28 位的数字可以作为 decimal类型存储而不失其精确性。该类型对于必须避免舍入错误的应用程序(如记账)很有用。 float是浮点数,不能指定小数位。 参考技术B decimal 数据类型最多可存储 38 个数字,所有数字都能够放到小数点的右边。decimal 数据类型存储了一个准确(精确)的数字表达法;不存储值的近似值。
定义 decimal 的列、变量和参数的两种特性如下:
· p 小数点左边和右边数字之和,不包括小数点。如 123.45,则 p=5,s=2。
指定精度或对象能够控制的数字个数。
· s
指定可放到小数点右边的小数位数或数字个数。
p 和 s 必须遵守以下规则:0 <= s <= p <= 38。
numeric 和 decimal 数据类型的默认最大精度值是 38。在 Transact-SQL 中,numeric 与 decimal 数据类型在功能上等效。
当数据值一定要按照指定精确存储时,可以用带有小数的 decimal 数据类型来存储数字。
float 和 real 数据
float 和 real 数据类型被称为近似的数据类型。在近似数字数据类型方面,float 和 real 数据的使用遵循 IEEE 754 标准。
近似数字数据类型并不存储为多数数字指定的精确值,它们只储存这些值的最近似值。在很多应用程序中,指定值与存储值之间的微小差异并不明显。但有时这些差异也值得引起注意。由于 float 和 real 数据类型的这种近似性,当要求精确的数字状态时,比如在财务应用程序中,在那些需要舍入的操作中,或在等值核对的操作中,就不使用这些数据类型。这时就要用integer、decimal、money或smallmone数据类型。
在 WHERE 子句搜索条件中(特别是 = 和 <> 运算符),应避免使用 float 或 real 列。最好限制使用 float 和 real 列做> 或 < 的比较。
IEEE 754 规格提供了四种舍入模式:舍入到最接近的值、上舍入、下舍入和舍入到零。Microsoft® SQL Server™ 使用上舍入。所有的数值必须精确到确定的精度,但会产生细小的浮点值变化。因为浮点数字的二进制表示法可以采用很多合法舍入规则中的任意一条,因此我们不可能可靠地量化一个浮点值。
转换 decimal 和 numeric 数据
对于 decimal 和 numeric 数据类型,Microsoft® SQL Server™ 将精度和小数位数的每个特定组合看作是不同的数据类型。例如,decimal(5,5) 和 decimal(5,0) 被当作不同的数据类型。(因此在编存储过程当中使用的变量采用Real 或 Float,而不采用decimal类型)
在 Transact-SQL 语句中,带有小数点的常量自动转换为 numeric 数据值,且必然使用最小的精度和小数位数。例如,常量 12.345 被转换为 numeric 值,其精度为 5,小数位为 3。
从 decimal 或 numeric 向 float 或 real 转换会导致精度损失。从 int、smallint、tinyint、float、real、money 或 smallmoney 向 decimal 或 numeric 转换会导致溢出。
默认情况下,在将数字转换为较低精度和小数位数的 decimal 或 numeric 值时,SQL Server 使用舍入法。然而,如果 SET ARITHABORT 选项为 ON,当发生溢出时,SQL Server 会出现错误。若仅损失精度和小数位数,则不会产生错误。

Float 的科学计数法与值的问题,问题的根源在于 float 类型本身是一种不精确的数据表示方法, 也就是说, 你放一个数据进去, 拿出来的时候可能会存在一点点点误差, 而这点点点误差在做数据比较的时候就会导致数据不一致.本回答被提问者采纳

MySQL类型float double decimal的区别

float数值类型用于表示单精度浮点数值,而double数值类型用于表示双精度浮点数值,

float和double都是浮点型,而decimal是定点型;


MySQL 浮点型和定点型可以用类型名称后加(M,D)来表示,

M表示该值的总共长度,D表示小数点后面的长度,

M和D又称为精度和标度,如float(7,4)的 可显示为-999.9999,

MySQL保存值时进行四舍五入,如果插入999.00009,则结果为999.0001。


☆FLOAT和DOUBLE在不指 定精度时,默认会按照实际的精度来显示,而DECIMAL在不指定精度时,默认整数为10,小数为0。


测试1:

CREATE TABLE test1 (
f FLOAT(5,2) DEFAULT NULL,
d DOUBLE(5,2) DEFAULT NULL,
de DECIMAL(5,2) DEFAULT NULL
);
INSERT INTO test1(f,d,de) VALUES(1.23,1.23,1.23);

数据插入正确:技术分享

2.

INSERT INTO test1(f,d,de) VALUES(1.234,1.234,1.23);

数据插入都正确,但是f和d由于标度的限制,舍去了最后一位。

技术分享

3.

INSERT INTO test1(f,d,de) VALUES(1.234,1.234,1.234);

插入成功,但是有警告

技术分享

技术分享

4.把f,d,de的精度和标度去掉。

INSERT INTO test1(f,d,de) VALUES(1.234,1.234,1.234);

插入正确【f和d的数据正确插入,而de被截断】,同时也会有3一样的提示!

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

技术分享


5. 数据求SUM()时会出现不同的结果,float和double求SUM都会出现很多小数点,而decimal求SUM得到的是精准数值:

SELECT SUM(f),SUM(d),SUM(de) FROM test1;

技术分享

技术分享

理论上:f,d后面不应该出现很长的一串浮点小数点的。



本文出自 “我的JAVA世界” 博客,请务必保留此出处http://hanchaohan.blog.51cto.com/2996417/1943564

以上是关于MySQL中的float和decimal类型有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中的decimal是啥类型?

“decimal”是啥类型的MySQL?

Mysql数据类型DECIMAL(M,D)用法

MySQL的float和decimal的区别疑问

MySQL类型float double decimal的区别

mysql8 数据类型 float double decimal 的区别