MySQL

MySQL定点数据类型(精确值)-DECIMAL

2018-10-24  本文已影响0人  Jerry_1116

1 DECIMAL介绍

在MySQL中,DECIMAL和NUMERIC是定点类型数据,以二进制形式存储,因此存储的是准确的数字。
在创建MySQL的DECIMAL列的时候,可以指定进度和标度:DECIMAL(M,D)。M为精度(precision),表示该值的总长度;D为标度(scale),表示小数点后面的长度。
例如:
DECIMAL(7,4)可存储的数据范围为-999.9999~999.9999。MySQL保存值时进行四舍五入,如果插入999.00009,则结果为999.0001。
在标准SQL中,语法DECIMAL为默认值,等价于DECIMAL(10,0)。DECIMAL(M)等价于DECIMAL(M,0)。
FLOAT和DOUBLE在不指定精度时,默认会按照实际的精度来显示,而DECIMAL在不指定精度时,默认整数为10,小数为0,即DECIMAL(10,0)。

DECIMAL的数字总长度M最大为65,但是实际能表示的数值范围受精度和标度的限制。当DECIMAL(M,D)列存储的数值的小数位数超过D,则四舍五入到D位。当DECIMAL(M,D)列存储的数值大于该列能表示的范围,则存储为DECIMAL(M,D)能表示的最大值;当DECIMAL(M,D)列存储的数值小于该列能表示的范围,则存储为DECIMAL(M,D)能表示的最小值。

示例:
定义数据库列为DECIMAL(5,2)
插入数据:

插入值 结果
1.2345 小数点后最多2位,所以保存可以,自动四舍五入数据截断,但会报waning
12.34 OK
1234.5 因为小数部分未满2位,要补0.所以保存应该1234.50。所以整个位数超出了5,保存报错。
1.2 小数未满部分补0。按照1.20保存。

注意
在mysql中float、double(或real)是浮点数,decimal(或numberic)是定点数。
浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的数据范围;它的缺点是会引起精度问题。
在今后关于浮点数和定点数的应用中,大家要记住以下几点:
1、浮点数存在误差问题;
2、对货币等对精度敏感的数据,应该用定点数表示或存储;
3、编程中,如果用到浮点数,要特别注意误差问题,并尽量避免做浮点数比较;
4、要注意浮点数中一些特殊值的处理。

2 浮点数和定点数的比较

默认状态比较

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

上一篇下一篇

猜你喜欢

热点阅读