`

Java的Double类型相关运算问题

阅读更多
double t1=34.0;
double t2=2.55
System.out.println(t1*t2);
结果不等于 86.7

解决方案 采用 java.math.BigDecimal
此处有一个通用类


import  java.math.BigDecimal;  
 
/** */ /** 

* 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精 

* 确的浮点数运算,包括加减乘除和四舍五入。 

*/  
 
public   class  Arith{  
 
//默认除法运算精度  
 
private   static   final   int  DEF_DIV_SCALE =  10 ;  
 
//这个类不能实例化  
 
private  Arith(){  
 
}  
 
/** */ /** 

* 提供精确的加法运算。 

* @param v1 被加数 

* @param v2 加数 

* @return 两个参数的和 

*/  
 
public   static   double  add( double  v1, double  v2){  
 
BigDecimal b1 =  new  BigDecimal(Double.toString(v1));  
 
BigDecimal b2 =  new  BigDecimal(Double.toString(v2));  
 
return  b1.add(b2).doubleValue();  
 
}  
 
/** */ /** 

* 提供精确的减法运算。 

* @param v1 被减数 

* @param v2 减数 

* @return 两个参数的差 

*/  
 
public   static   double  sub( double  v1, double  v2){  
 
BigDecimal b1 =  new  BigDecimal(Double.toString(v1));  
 
BigDecimal b2 =  new  BigDecimal(Double.toString(v2));  
 
return  b1.subtract(b2).doubleValue();  
 
}  
 
/** */ /** 

* 提供精确的乘法运算。 

* @param v1 被乘数 

* @param v2 乘数 

* @return 两个参数的积 

*/  
 
public   static   double  mul( double  v1, double  v2){  
 
BigDecimal b1 =  new  BigDecimal(Double.toString(v1));  
 
BigDecimal b2 =  new  BigDecimal(Double.toString(v2));  
 
return  b1.multiply(b2).doubleValue();  
 
}  
 
/** */ /** 

* 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 

* 小数点以后10位,以后的数字四舍五入。 

* @param v1 被除数 

* @param v2 除数 

* @return 两个参数的商 

*/  
 
public   static   double  div( double  v1, double  v2){  
 
return  div(v1,v2,DEF_DIV_SCALE);  
 
}  
 
/** */ /** 

* 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 

* 定精度,以后的数字四舍五入。 

* @param v1 被除数 

* @param v2 除数 

* @param scale 表示表示需要精确到小数点以后几位。 

* @return 两个参数的商 

*/  
 
public   static   double  div( double  v1, double  v2, int  scale){  
 
if (scale< 0 ){  
 
throw   new  IllegalArgumentException(  
 
"The scale must be a positive integer or zero" );  
 
}  
 
BigDecimal b1 =  new  BigDecimal(Double.toString(v1));  
 
BigDecimal b2 =  new  BigDecimal(Double.toString(v2));  
 
return  b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();  
 
}  
 
/** */ /** 

* 提供精确的小数位四舍五入处理。 

* @param v 需要四舍五入的数字 

* @param scale 小数点后保留几位 

* @return 四舍五入后的结果 

*/  
 
public   static   double  round( double  v, int  scale){  
 
if (scale< 0 ){  
 
throw   new  IllegalArgumentException(  
 
"The scale must be a positive integer or zero" );  
 
}  
 
BigDecimal b =  new  BigDecimal(Double.toString(v));  
 
BigDecimal one =  new  BigDecimal( "1" );  
 
return  b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();  
 
}  
 
}
分享到:
评论

相关推荐

    Java Double 精度问题总结

    使用Java,double 进行运算时,经常出现精度丢失的问题,总是在一个正确的结果左右偏0.0000**1。 特别在实际项目中,通过一个公式校验该值是否大于0,如果大于0我们会做一件事情,小于0我们又处理其他事情。 这样的...

    Java Double相加出现的怪事

    Java Double相加出现的怪事,浮点运算不精确问题

    java中double类型运算结果异常的解决方法

    下面小编就为大家带来一篇java中double类型运算结果异常的解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    java四则运算

    编写一个包含主方法main的公共类(访问权限为public的类),主方法main中完成的任务是:从键盘上输入两个运算数(double 类型)和一个运算符(char 类型),使用(1)中的类输出运算结果(保留两位小数)。...

    Java中double类型下出现精度计算错误情况下出力方法

    Java中的简单浮点数类型float和double不能够进行运算,因为大多数情况下是正常的,但是偶尔会出现如上所示的问题。这个问题其实不是JAVA的bug,因为计算机本身是二进制的,而浮点数实际上只是个近似值,所以从二进制...

    Java 精确计算-double-float-String

    NULL 博文链接:https://thinktothings.iteye.com/blog/801301

    用JAVA实现复数的四则运算

    import java.io.*; public class Book{ double sb; double xb; Book(double x,double y){ this.sb=x; this.xb=y; } Book(){ } public static void main(String args[]){ System.out.println("请...

    java复数四则运算-类的定义与对象.rar

    1. 编写一个类实现复数的运算。 复数类ComplexNumber的属性: m_dRealPart:实部,代表复数的实数部分。 m_dImaginPart:虚部,代表复数的虚数部分。 复数类ComplexNumber的方法: ComplexNumber():构造函数,...

    java编写一个类,该类可以进行加、减、乘、除四则运算,并且输出运算结果

    (2)编写一个包含主方法main的公共类(访问权限为public的类),主方法main中完成的任务是:从键盘上输入两个运算数(double 类型)和一个运算符(char 类型),使用(1)中的类输出运算结果(保留两位小数)。...

    BigDecimal 加减乘除运算

    Java中BigInteger的数学运算,BigDecimal 加减乘除运算,Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大...

    Java与MySQL中小数保存问题解析.pptx.pptx

    在Java和MySQL中,小数的精度可能会受到限制,如float类型的小数只能精确到6-7位,double类型也只能精确到15-16位。 浮点数运算问题 在进行浮点数运算时,可能会出现精度丢失的问题,例如0.1+0.2的结果并不等于0.3...

    JAVA8大数据类型.pdf

    不同类型数据间的优先关系如下: 低---------------------------------------------&gt;⾼ byte,short,char-&gt; int -&gt; long -&gt; float -&gt; double 运算中,不同类型的数据先转化为同⼀类型,然后进⾏运算,转换规则如下: ...

    Java 加减乘除工具类(解决精度损失问题)

    唔,其实里面就是一个工具类,加减乘除、保留两位小数。一共5个方法。。。emmmm........因为宝宝想分想疯了。... Double bDouble=Calculation.sub(99.2,aDouble); System.out.println(bDouble); } }

    125集专攻JAVA基础 JAVA零基础入门学习视频教程 动力节点JAVA视频教程.txt

    北京动力节点-Java编程零基础教程-059-Java基本语法-数据类型-float与double的区别.avi 北京动力节点-Java编程零基础教程-060-Java基本语法-数据类型-布尔型.avi 北京动力节点-Java编程零基础教程-061-Java基本...

    chujun#gitbook#double参与运算1

    double不能参与乘,除运算,请用BigDecimal,BigInteger金额从19.9===&gt;19.89了。double priceFen = price

    java+基本数据类型+详细介绍+资源合集

    java基本数据类型 ⼀个Java程序可以认为是⼀系列对象的集合,⽽这些对象通过调⽤彼此的⽅法来协同⼯作。 对象:对象是类的⼀个实例,有状态(属性)和⾏为(⽅法)。 类:类是⼀个模板,他描述⼀类对象的⾏为和状态...

    Java BigDecimal使用及基本运算(推荐)

    Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。这篇文章主要介绍了Java BigDecimal使用指南针(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,...

    [Java] 实现矩阵的运算

    I. Implement Matrix Operations in Java import java.text.DecimalFormat; /** * 实现矩阵的运算 ... * - add(Matrix target), multiply(double target): Linear Operations(线性运算) * - multiply(Matrix tar

    个人开发中遇到常见问题及解决办法(吐血总结)

    2 java中double类型数据运算不精确问题的解决办法(采用java.math.BigDecimal类来进行精确计算。) 3 get方式传值乱码问题解决 4 查询被锁的数据,解锁 ,数据库连接数 5 下拉框的数据回显 6 mybatis批量更新,批量...

    java数学计算工具类 double精确的加法算法 double精确的减法算法

    java数学计算工具类 double精确的加法算法 double精确的减法算法 精确的乘法算法 对精确的除法运算,当发生除不尽的 保留小数、数值精度

Global site tag (gtag.js) - Google Analytics