java中如何使用BigDecimal使得Double类型保留两位有效数字

一、场景:从数据表中读出Decimal类型的数据直接塞给Double类型的对象时,并不会有什么异常。

如果要再此基础上计算,就会发生异常。

比如:读出数据为0.0092,将其乘以100,则变成了0.919999999999999...

二、原因:

java mysql 数据类型对照如下:

类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述
           
VARCHAR L+N VARCHAR java.lang.String 12  
CHAR N CHAR java.lang.String 1  
BLOB L+N BLOB java.lang.byte[] -4  
TEXT 65535 VARCHAR java.lang.String -1  
           
INTEGER 4 INTEGER UNSIGNED java.lang.Long 4  
TINYINT 3 TINYINT UNSIGNED java.lang.Integer -6  
SMALLINT 5 SMALLINT UNSIGNED java.lang.Integer 5  
MEDIUMINT 8 MEDIUMINT UNSIGNED java.lang.Integer 4  
BIT 1 BIT java.lang.Boolean -7  
BIGINT 20 BIGINT UNSIGNED java.math.BigInteger -5  
FLOAT 4+8 FLOAT java.lang.Float 7  
DOUBLE 22 DOUBLE java.lang.Double 8  
DECIMAL 11 DECIMAL java.math.BigDecimal 3  
BOOLEAN 1 同TINYINT      
           
ID 11 PK (INTEGER UNSIGNED) java.lang.Long 4  
           
DATE 10 DATE java.sql.Date 91  
TIME 8 TIME java.sql.Time 92  
DATETIME 19 DATETIME java.sql.Timestamp 93  
TIMESTAMP 19 TIMESTAMP java.sql.Timestamp 93  
YEAR 4 YEAR java.sql.Date 91

三、解决方案:

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、插入数据

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、当整数部分合法,小数部分多余的位数,直接截断。

时间: 2024-10-14 20:46:33

java中如何使用BigDecimal使得Double类型保留两位有效数字的相关文章

java double类型保留两位小数和四舍五入

package com.clzhang.sample; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.DecimalFormat; import java.text.NumberFormat; public class DoubleTest { /** * 保留两位小数,四舍五入的一个老土的方法 * @param d * @return */ public static double fo

double 类型保留两位小数

1.Math.Round(0.333333,2);//按照四舍五入的国际标准2. double dbdata=0.335333; string str1=String.Format("{0:F}",dbdata);//默认为保留两位3. float i=0.333333; int j=(int)(i * 100); i = j/100;4. decimal.Round(decimal.Parse("0.3333333"),2)5. private System.Gl

Double 数据保留两位小数一:五舍六入

1 package com; 2 3 public class T2 { 4 5 public static void main(String[] args) { 6 7 System.out.println(calculateProfit(0.233)); 8 System.out.println(calculateProfit(0.235)); 9 System.out.println(calculateProfit(0.237)); 10 System.out.println(calcul

java,中双精度double控制保留两位小数,js控制两位小数

Java DecimalFormat dcmFmt = new DecimalFormat("0.00"); double db = 12333.353; System.out.println(dcmFmt.format(db)); JS <script type="text/javascript"> //保留两位小数 //功能:将浮点数四舍五入,取小数点后2位 function toDecimal(x) { var f = parseFloat(x);

Java Double类型保存两位小数

1.保留两位小数 double c=19.98555315; java.text.DecimalFormat df = new java.text.DecimalFormat("0.00"); String str = df.format(c);

【开发日志】Long/Bigdecimal/double数据类型保留两位小数

今天开发碰到个需求就是保证回显到页面的数据保留两位小数,实际我们的数据是八位小数 可以明显的看到Bigdecimal是八位,虽说Long类型不用保留两位(强迫症),但是我还是想保留 1.Long类型 String.format("%.2f",参数) .第二个参数是double数据类型,String,int,Long 类型是不行的,float可以 2.Bigdecimal java.text.DecimalFormat df =new java.text.DecimalFormat(&q

Double值保留两位小数的四种方法

public class DoubleTest { //保留两位小数第三位如果大于4会进一位(四舍五入) double f = 6.23556; /** *使用精确小数BigDecimal */ public void fun1() { BigDecimal bg = new BigDecimal(f); /** * 参数: newScale - 要返回的 BigDecimal 值的标度. roundingMode - 要应用的舍入模式. 返回: 一个 BigDecimal,其标度为指定值,其非

Java-小技巧-005-double类型保留两位小数4种方法

4种方法,都是四舍五入,例: import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; public class format { double f = 111231.5585; public void m1() { BigDecimal bg = new BigDecimal(f); double f1 = bg.setScale(2, BigDecimal.ROUND

java使double保留两位小数的多方法 java保留两位小数

这篇文章主要介绍了java使double类型保留两位小数的方法,大家参考使用吧 复制代码 代码如下: mport java.text.DecimalFormat; DecimalFormat    df   = new DecimalFormat("######0.00"); double d1 = 3.23456  double d2 = 0.0;double d3 = 2.0;df.format(d1); df.format(d2); df.format(d3); 3个结果分别为: