`

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` 类型精度问题,并提供几种解决方法。 #### 一、Java Double 精度丢失的原因 1. **二进制表示限制**:`double` 类型基于IEEE 754标准的双精度格式,使用64位来表示一个浮点数。...

    test2_JavaDouble类型比较大小_java编程_

    标题"test2_JavaDouble类型比较大小_java编程_"提示我们关注的是Java中`Double`类型的比较操作。通常,我们可能会像处理整数那样直接使用`&gt;`或`来比较两个`Double`值,例如`double a = 0.1; double b = 0.2; if (a +...

    Java Double相加出现的怪事

    Java 中的浮点数类型 float 和 double 在进行运算时会出现不精确的问题,这是因为计算机无法精确地表示十进制小数。这种问题不仅存在于 Java 中,在其它许多编程语言中也存在。 问题的提出: 编译运行下面的 Java ...

    Java 精确计算-double-float-String

    通常,Java中的`double`和`float`类型在进行数学运算时由于二进制浮点数的表示方式,会存在精度损失。例如,0.1 + 0.2并不等于0.3,而是非常接近但不完全相等的一个值。这种现象是由IEEE 754浮点数标准导致的,而非...

    double类型,精确的数据运算

    `double`类型是Java、C++、Python等许多编程语言中的一个浮点数类型,它通常用来表示较大的数值或需要较高精度的计算。然而,`double`类型的精度是有限的,通常约为15到16位有效数字,这可能导致在某些需要高精度...

    java.四则运算器

    在四则运算中,根据输入的数字类型,可能需要进行类型转换,例如将`int`转换为`double`以执行精确的浮点运算。 接下来,我们将探讨运算符的使用。在Java中,加法运算符是`+`,减法是`-`,乘法是`*`,除法是`/`。...

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

    在Java编程语言中,`double`类型用于表示浮点数,它在大多数计算中能提供较高的精度和广泛的数值范围。然而,当你对`double`类型的数值进行运算时,可能会遇到结果值异常的情况,即计算结果并非预期的准确值。这通常...

    java复数四则运算

    本实例主要探讨如何利用Java的多态性来实现复数的四则运算,即加法、减法、乘法和除法。以下我们将详细讲解这个主题。 首先,我们需要创建一个`ComplexNumber`类来表示复数。这个类至少有两个属性:`double real`...

    java-16位内存数据转化为double型

    3. **创建ByteBuffer并转换**:使用`java.nio.ByteBuffer`类可以方便地将字节序列转换为各种基本类型,包括`double`。 4. **解析并转换为double**:最后一步是使用ByteBuffer的方法,如`getDouble()`,将字节序列...

    java_double_精度

    Java 中的双精度浮点数(double)类型在进行运算时经常出现精度丢失的问题,这是由于双精度浮点数在计算机内部的存储方式所致。双精度浮点数使用 64 位二进制数来存储小数,然而这种存储方式会导致某些小数无法精确...

    Java变量与数据类型、数据运算中易混知识点总结

    下面将对Java中的变量、数据类型以及数据运算中的一些易混知识点进行详细解释。 首先,我们来谈谈Java中的变量。变量可以看作是程序中存储数据的容器,它有特定的名称(标识符)和类型。在Java中,声明变量时需要...

    java四则运算

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

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

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

    java表达式计算支持自定义运算

    Java表达式计算支持自定义运算是一项重要的编程功能,它允许开发者根据特定需求扩展语言的运算符集合,并定义这些运算符的行为。在Java中,我们可以通过创建自己的类和接口来实现这个功能,使得程序能处理更复杂的...

    java 强制类型转换示例

    在Java编程语言中,强制类型转换是将一个数据类型转换为另一个兼容的数据类型的过程。这通常发生在处理不同类型的变量或对象之间需要交互的情况。在Java中,有两种类型的转换:自动类型转换(隐式转换)和强制类型...

    JAVA中浮点数的运算

    这篇博客主要探讨了Java中浮点数(包括`float`和`double`类型)运算的特性、存在的问题以及如何应对这些挑战。 首先,Java中的`float`类型占用32位存储空间,它能表示大约6到7位十进制的有效数字,而`double`类型则...

    Java实验-基本数据类型及操作

    1. 隐式类型转换:隐式类型转换是指Java自动将一种数据类型转换为另一种数据类型的过程,例如将int类型转换为double类型。 2. 显示类型转换:显示类型转换是指使用强制类型转换符号将一种数据类型转换为另一种数据...

    用Java编写的四则运算器

    2. **数据类型和变量**:Java支持基本数据类型(如int, double, char等)以及引用数据类型。在四则运算器中,可能有变量存储用户的输入数字和计算结果。 3. **输入/输出处理**:Java提供了`Scanner` 类来读取用户...

    java实现四则运算 第三次实验

    在四则运算的上下文中,这意味着我们可以创建具有相同名字(如`calculate`)但参数数量或类型不同的方法,以支持不同类型的运算。 例如,可以创建一个接受两个`Number`对象(可能是`Integer`、`Double`或其他子类)...

    java复数运算器

    在Java编程语言中,复数运算器是一种程序,它允许用户执行涉及复数的数学运算。复数是数学中的一个概念,表示为a + bi的形式,其中a是实部,b是虚部,i是虚数单位,满足i² = -1。这个“java复数运算器”项目提供了...

Global site tag (gtag.js) - Google Analytics