java中如何使⽤BigDecimal使得Double类型保留两位有效数字⼀、场景:从数据表中读出Decimal类型的数据直接塞给Double类型的对象时,并不会有什么异常。
如果要再此基础上计算,就会发⽣异常。
⽐如:读出数据为0.0092,将其乘以100,则变成了
⼆、原因:
java mysql 数据类型对照如下:
类型名称显⽰长度数据库类型JAVA类型JDBC类型索引(int)描述VARCHAR L+N VARCHAR java.lang.String12
CHAR N CHAR java.lang.String1
BLOB L+N BLOB java.lang.byte[]-4
TEXT65535VARCHAR java.lang.String-1
INTEGER4INTEGER UNSIGNED java.lang.Long4
TINYINT3TINYINT UNSIGNED java.lang.Integer-6
SMALLINT5SMALLINT UNSIGNED java.lang.Integer5
MEDIUMINT8MEDIUMINT UNSIGNED java.lang.Integer4
BIT1BIT java.lang.Boolean-7
BIGINT20BIGINT UNSIGNED java.math.BigInteger-5
FLOAT4+8FLOAT java.lang.Float7
DOUBLE22DOUBLE java.lang.Double8
DECIMAL11DECIMAL java.math.BigDecimal3
BOOLEAN1同TINYINT
ID11PK (INTEGER UNSIGNED)java.lang.Long4
DATE10DATE java.sql.Date91
TIME8TIME java.sql.Time92
DATETIME19DATETIME java.sql.Timestamp93
TIMESTAMP19TIMESTAMP java.sql.Timestamp93
91
YEAR4YEAR java.sql.Date
三、解决⽅案:
1、将double类型重新变成BigDecimal类型,最后的结果还要获取有效位数
double d = 111231.5585;
BigDecimal b = new BigDecimal(f);
double df = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
2、因为数据表⾥的类型是Decimal,所以讲java对象中对应的成员变量的类型改成BigDecimal即可。
四、BigDecimal简介
在mysql中,对于精度⽐较⾼的数据存储,⽐如money,需要⽤decimal类型,⽽不会采⽤float或double类型,原因在于后者数据误差较⼤。decimal列的声明语法是decimal(m,d)。
在mysql 5.1中,参数的取值范围:
1、M是数字的最⼤数(精度)。其范围为1~65(在较旧的MySQL版本中,允许的范围是1~254)。
2、D是⼩数点右侧数字的数⽬(标度)。其范围是0~30,但不得超过M。
说明:float占4个字节,double占8个字节,decimail(M,D)占M+2个字节。
如DECIMAL(5, 2) 的最⼤值为9 9 9 9 . 9 9,因为有7 个字节可⽤。
注:
M 与D 对DECIMAL(M, D) 取值范围的影响
类型说明取值范围(MySQL < 3.23)取值范围(MySQL >= 3.23)
DECIMAL(4, 1) -9.9 到 99.9 -999.9 到 9999.9
DECIMAL(5, 1) -99.9 到 999.9 -9999.9 到 99999.9
DECIMAL(6, 1) -999.9 到 9999.9 -99999.9 到 999999.9
DECIMAL(6, 2) -99.99 到 999.99 -9999.99 到 99999.99
DECIMAL(6, 3) -9.999 到 99.999 -999.999 到 9999.999
# 在mysql 3.23 及以后的版本中,decimal(m, d) 的取值范围等于早期版本中的decimal(m + 2, d) 的取值范围。另外⼀种数据类型:
LongBlob,这种数据类型可以直接把图像⽂件存到数据表中!
在研究mysql的decimal数据类型,现把数据实验结果公布:
数据库版本:Server version: 5.0.45 Source distribution
1、创建表结构
create table ta (a float,b decimal(10,5));
2、插⼊数据
bigdecimal除法保留小数insert into ta (a,b) values(1,12345.123423);
实际插⼊的b列数据为:12345.12342
insert into ta (a,b) values(1,123456.1234);
实际插⼊的b列数据为:99999.99999
结论:decimal数据类型,
1、当插⼊的整数部分的值超过了其表⽰范围后就直接忽略了⼩数部分的值,并以最⼤值填充。
2、当整数部分合法,⼩数部分多余的位数,直接截断。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论