MySQLdecimal对应java

Posted 叶涛网站推广优化

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQLdecimal对应java相关的知识,希望对你有一定的参考价值。

mysql 字段是DECIMAL(9,2) 字段=''是什么意思

mysql字段decimal(9,2)中9是定点精度,2是小数位数。

存在这么一个公式:decimal(a,b)。

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

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

认小数位数是0。

MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,目前属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面,MySQL是最好的RDBMS(RelationalDatabaseManagementSystem,关系数据库管理系统)应用软件。

如何从mysql中取出类型为decimal的数据

如何从mysql中取出类型为decimal的数据

1、查询表结构,找出数据类型为decimal的字段2、select数据类型为decimal的字段从表中3、数据导出

MySQL中Decimal类型和Float Double的区别

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 test(f FLOAT(5,2) DEFAULT NULL,d DOUBLE(5,2) DEFAULT NULL,de DECIMAL(5,2) DEFAULT NULL);

2、DESC test;

3、INSERT INTO test(f,d,de) VALUES(1.23,1.23,1.23);

数据插入都正确

4、INSERT INTO test(f,d,de) VALUES(1.234,1.234,1.23);

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

5、INSERT INTO test(f,d,de) VALUES(1.234,1.234,1.234);

数据也插入成功,但是有一个警告提示:

1 queries executed, 1 success, 0 errors, 1 warnings

Note Code : 1265

Data truncated for column 'de' at row 1

6、将id1,id2,id3的精度和标度都去掉

ALTER TABLE test MODIFY f FLOAT;

ALTER TABLE test MODIFY d DOUBLE;

ALTER TABLE test MODIFY de DECIMAL;

DELETE FROM test;

DESC test;

7、INSERT INTO test(f,d,de) VALUES(1.234,1.234,1.234);

1 queries executed, 1 success, 0 errors, 1 warnings

Note Code : 1265

Data truncated for column 'de' at row 1

f和d的数据正确插入,而de被截断。

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

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

8、INSERT INTO test(f,d,de) VALUES(1.234,0.01,1.23);

数据都插入成功

9、SELECT SUM(f),SUM(d),SUM(de) FROM test;

理论上SUM(f)=3.698,SUM(d)=2.474,SUM(de)=3.46,但f,d都出现后面很长的一串浮点小数点。float是单精度,double是双精度,decimal是数字型,它们所占的内存空间不一样,表示的位数也不一样。除了科学计算以外,一般不用double型的。对于数字(包括小数)一般用decimal型的。

我们可以像如下的方式定义一个decimal类型的浮点数:

decimal d = 12.30m;

对decimal、float、double错误的认识

在精确计算中使用浮点数是非常危险的,尽管c#在浮点数运算时采取了很多措施使得浮点数运算的结果看起来是非常正常的。但实际上如果不清楚浮点数的特性而贸然使用的话,将造成非常严重的隐患。  

考虑下面的语句:  

doubledd=10000000000000000000000d;  

dd+=1;  

console.writeline("0:g50",dd);

输出是:1000000000000000000000000

这就是浮点数精度损失的问题,最重要的是,在精度损失的时候,不会报告任何的错误,也不会有任何的异常产生。  

浮点数的精度损失可能在很多地方出现,例如d*g/g不一定等于d,d/g*g也不一定等于d。

还有两个非常危险的错误认识!!  

1、decimal不是浮点型、decimal不存在精度损失。

下面有段程序大家可以去看看结果是什么。记住!所有的浮点型变量都存在精度损失的问题,而decimal是一个不折不扣的浮点型,不论它精度有多高,精度损失依然存在!  

decimaldd=10000000000000000000000000000m;  

dd+=0.1m;  

console.writeline("0:g50",dd);

2、decimal所能储存的数比double大,从double到decimal的类型转换不会出现任何问题。

微软在decimal的帮助上真的要好好反省了。实际上只有从整形到decimal的转换才是扩大转换,decimal的精度比double大,但所能储存的最大数却比double要小。

“decimal类型是适合财务和货币计算的128位数据类型。”

当然,decimal在大多数情况下是安全的,但浮点数在理论上是不安全的。

至于精度误差造成的显示问题,则是很容易修补的。浮点数会带来的问题以及整型能避免的问题就是一个:

譬如说从a帐户转账到b帐户,经计算得出结果是3.788888888888888元,那么我们从a帐户扣除这么多钱,b帐户增加这么多钱,但事实上a帐户不一定会扣除准确的数值,例如a帐户的金额在100000000000,那么这个时候100000000000-3.788888888888888运算结果很有可能是99999999996.211111111111112。而这个时候b帐户的金额为0则很有可能加上准确的数值,如3.788888888888888,这样一来,0.011111111111112元钱就会不见了,日积月累的,差额就会越来越大。

double是64位的,比single-32位精度高。

decimal128位高精度浮点数,常用于金融运算,不会出现浮点数计算的误差,decimal类型具有更高的精度和更小的范围,这使它适合于财务和货币计算。

mysql 中的decimal

可能做程序的人都知道,float类型是可以存浮点数(即小数类型),但是float有个坏处,当你给定的数据是整数的时候,那么它就以整数给你处理。这样我们在存取货币值的时候自然遇到问题,我的default值为:0.00而实际存储是0,同样我存取货币为12.00,实际存储是12.

幸好mysql提供了两个数据类型:numeric和decimal,这两种数据类型可以轻松解决上面的问题:

NUMERIC 和 DECIMAL 类型被 MySQL 以同样的类型实现,这在 SQL92 标准中是允许的。他们用于保存对准确精度有重要要求的值,例如与金钱有关的数据。当以它们中的之一声明一个列时,精度和数值范围可以(通常是)被指定;例 如:

salary DECIMAL(5,2)

在这个例子中,5 (精度(precision)) 代表重要的十进制数字的数目,2 (数据范围(scale)) 代表在小数点后的数字位数。在这种情况下,因此,salary 列可以存储的值范围是从 -99.99 到 99.99。(实际上 MySQL 在这个列中可以存储的数值可以一直到 999.99,因为它没有存储正数的符号)。

M 与D 对DECIMAL(M, D) 取值范围的影响

类型说明 取值范围(MySQL < 3.23) 取值范围(MySQL >= 3.23)十进制小数,他的精度高,而且没有误差。楼上说的不对,ta和浮点数相差很大。浮点数是直接把小数转化为二进制,二多数小数转化为二进制是有误差的,也就是说不能精确表示。decimal则可以没有任何误差的表示小数

mysqldecimal数据类型

1.float、double、decimal

  float:浮点型,4字节,32bit。

  double:双精度实型,8字节,64位

  decimal:数字型,128bit,不存在精度损失,常用于银行帐目计算。(28个有效位)

2.decimal使用说明:

decimal(a,b)
 

参数说明

a指定指定小数点左边和右边可以存储的十进制数字的最大个数,最大精度38。
b指定小数点右边可以存储的十进制数字的最大个数。小数位数必须是从 0 到 a之间的值。默认小数位数是 0。

 

备注

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

另:float和double做算术运算,数值溢出不会报错,精度会因此有损失。decimal会直接报错。

  money可以更通用的表示金额,对于便利店商品这种通常固定至小数点后2位时,可以使用decimal。



以上是关于MySQLdecimal对应java的主要内容,如果未能解决你的问题,请参考以下文章

mysqlconvertdecimal转字符

细说JavaJava封箱拆箱的一些问题

javajava反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明可用于微信支付 签名生成

JavaJava中的数据类型

javajava getOrDefault 方法的一个坑,容易导致OOM

JAVAjava 与 php 的构造方法执行机制异同