`

Java的double的精度问题以及解决方案

    博客分类:
  • JDK
阅读更多
// 在java中,使用double进行运算,有时会出现精度丢失的问题,值会有那么0.00000***1偏差的偏差,导致匹配校验常常出现问题 解决方案如下:  

//加,乘,除都正常,而且,只要不是这种类型的相减,其他减法也正常
 

//原因:
//因为它的存储形式是二进制的10 进制转化成2进制进行运算可能会误差的,你也可以得到你想要的无精度损失的结果,前提是你将123写成1.23e+2, 123.12写成1.2312e+2双精度形式,
  
//否则从正整型123转化为双精度过程中就可能丢失那么一点精度,因为有限长度的寄存器位仍然无法表示无穷小的精度的。
 /**   
     * 对double数据进行取精度.        
     * @param value  double数据.   
     * @param scale  精度位数(保留的小数位数).        
     * @param roundingMode  精度取值方式.        
     * @return 精度计算后的数据.       
     */   
    public static double round(double value, int scale,int roundingMode) {    
        BigDecimal bd = new BigDecimal(value);           
        bd = bd.setScale(scale, roundingMode);            
        double d = bd.doubleValue();            
        bd = null;           
        return d;        
    }      

/**  
     
 * double 相加       
     
 * @param d1       
     
 * @param d2       
     
 * @return       
     
 */  
    
public double sum(double d1,double d2){  
        
	BigDecimal bd1 = new BigDecimal(Double.toString(d1));          
        
	BigDecimal bd2 = new BigDecimal(Double.toString(d2));          
        
	return bd1.add(bd2).doubleValue();      
    
}    
    
    

/**  
     
 * double 相减       
     
 * @param d1       
     
 * @param d2       
     
 * @return       
     
 */  
    
public double sub(double d1,double d2){  
        
	BigDecimal bd1 = new BigDecimal(Double.toString(d1));          
        
	BigDecimal bd2 = new BigDecimal(Double.toString(d2));
        
	return bd1.subtract(bd2).doubleValue();
    
}
    
    

/**  
     
 * double 乘法       
     
 * @param d1       
     
 * @param d2       
     
 * @return       
     
 */
     
public double mul(double d1,double d2){
      
	BigDecimal bd1 = new BigDecimal(Double.toString(d1));
      
	BigDecimal bd2 = new BigDecimal(Double.toString(d2));
         
	return bd1.multiply(bd2).doubleValue();
     
}
     
     

/**  
      
 * double 除法       
      
 * @param d1       
      
 * @param d2  
      
 * @param scale 四舍五入 小数点位数       
      
 * @return      
      
 */
     
public double div(double d1,double d2,int scale){
      
	//  当然在此之前,你要判断分母是否为0,            
      
	//  为0你可以根据实际需求做相应的处理
      
	BigDecimal bd1 = new BigDecimal(Double.toString(d1));          
      
	BigDecimal bd2 = new BigDecimal(Double.toString(d2));          
      
	return bd1.divide (bd2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();      
  
} 
     


//这样,计算double类型的数据计算问题就可以处理了。另外补充一下JavaScript四舍五入的方法:小数点问题
    
/* Math.round(totalAmount*100)/100;//(保留2位)
     
function formatFloat(src,pos){
     
	returnMath.round(src*Math.pow(10,pos))/Math.pow(10,pos);
     
}*/

 

       

   

分享到:
评论

相关推荐

    Java Double 精度问题总结

    本文将详细介绍Java中的 `double` 类型精度问题,并提供几种解决方法。 #### 一、Java Double 精度丢失的原因 1. **二进制表示限制**:`double` 类型基于IEEE 754标准的双精度格式,使用64位来表示一个浮点数。...

    java_double_精度

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

    解决java数值范围以及float与double精度丢失的问题

    解决java数值范围以及float与double精度丢失的问题 Java中的数值范围和浮点数精度问题是许多开发者经常遇到的问题。下面我们将详细探讨Java中的数值范围、float和double类型的精度问题,并且提供解决方案。 一、...

    test2_JavaDouble类型比较大小_java编程_

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

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

    一共5个方法。。。emmmm.....为啥分这么高呢。因为宝宝想分想疯了。 附代码,有土豪就打赏打赏,没土豪的直接拿去使吧。 package cn.cisdom.base.utils; import java.math.BigDecimal; import java.text....

    Java POI读取excel中数值精度损失问题解决

    另一种解决方法是使用 Java 处理来解决数值精度损失的问题。我们可以使用 `NumberFormat` 对象来格式化数值,以确保读取到的数据是正确的。例如: ``` public class CommonUtil { private static NumberFormat ...

    计算机精度问题(Double)

    解决精度问题的方法有很多,如使用更高精度的数据类型(如Java中的`BigDecimal`),或者使用特定的算法进行浮点数比较。在进行浮点数计算时,可以设定一个容差值(epsilon),只要两个数的差的绝对值小于这个容差,...

    Java 精确计算-double-float-String

    标题中的"Java 精确计算 - double-float-String"指向的是Java中处理浮点数(double和float)以及字符串表示的数值时可能遇到的精度问题,以及如何通过特定方法实现精确计算。描述中提到的链接指向了一个具体的博客...

    浅谈Java double 相乘的结果偏差小问题

    本文将深入探讨这个问题,并提供两种解决方案。 首先,我们需要理解浮点数在计算机中的存储原理。Java中的`double`类型是按照IEEE 754标准来存储和计算的,它使用64位来表示一个浮点数,其中包括1位符号位、11位...

    Java中浮点数精度问题的解决方法

    总的来说,Java中解决浮点数精度问题的关键是使用BigDecimal类,并且要注意构造方法的选择,避免在转换过程中引入额外的精度损失。在编写涉及金融计算或需要高度精确性的程序时,使用BigDecimal是最佳实践。同时,...

    DecimalFormat精度解决,商业运算精度问题

    ### DecimalFormat精度解决与商业运算精度问题 在进行财务计算或者商业运算时,精度问题往往成为影响最终结果准确性的关键因素之一。特别是在Java这样的语言环境中,由于其内部采用二进制浮点数表示小数的方式,这...

    Java小数精度、时间格式和类型转换.doc

    Java 小数精度、时间格式和类型转换 Java 中的类型转换是非常重要的,特别是在处理小数和日期时。在 Java 中,存在多种类型的转换,包括基本类型的转换、包装...小数精度问题和日期格式化是 Java 中非常重要的概念。

    float和double

    本文将详细解释float和double的范围和精度,及其在商业计算中的应用问题和解决方法。 1. 范围 float和double的范围是由指数的位数来决定的。float的指数位有8位,而double的指数位有11位。因此,float的指数范围为...

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

    为了解决这个问题,Java提供了`BigDecimal`类,它能够进行任意精度的浮点数运算,确保结果的精确性。 使用`BigDecimal`类的关键在于避免直接从`double`转换到`BigDecimal`,因为`BigDecimal(double val)`构造器可能...

    Java用BigDecimal解决double类型相减时可能存在的误差

    在Java编程语言中,`double`类型用于表示浮点数,但存在精度问题,尤其是在进行数学运算时。这是因为`double`是基于二进制浮点数标准(IEEE 754)来存储和计算的,这可能导致计算结果与预期的十进制值存在微小的差异...

    java运算java运算.doc

    Java 运算精度问题与解决方案 在 Java 中,对于浮点数的运算存在精度问题,这是由于浮点数的计算是非精确计算的。这种问题在财务应用中非常重要,因为它可能导致严重的财务错误。 问题描述 在 Java 中,浮点数的...

    Java BigDecimal和double示例及相关问题解析

    在 Java 中,浮点数的表示形式有多种,包括 float 和 double 等,但是这些类型在进行计算时会出现精度问题,而 BigDecimal 则可以解决这种问题。本文将主要介绍 Java 中的 BigDecimal 和 double 的示例及相关问题...

    JAVA浮点数计算精度损失底层原理与解决方案

    浮点数计算在Java中常常会遇到精度损失的问题,这是由于计算机硬件的限制以及浮点数在二进制表示上的特性所导致的。在Java中,浮点数类型包括单精度浮点数`float`(4字节,32位)和双精度浮点数`double`(8字节,64...

    JAVA 编程常见问题

    ### JAVA 编程常见问题详解 ...以上是 Java 编程中常见的几个问题及解决方案。理解和掌握这些基础知识对于编写高效、可靠的 Java 应用程序至关重要。通过不断实践和学习,你将能够更加熟练地应对各种编程挑战。

    Java保留两位小数方法大全

    **问题背景**:在Java中使用`double`或`float`类型进行计算时,可能会出现非预期的结果,这是由于浮点数的存储方式导致的精度损失问题。 **解决方案**: 1. **使用`BigDecimal`**:对于需要高精度计算的场景,推荐...

Global site tag (gtag.js) - Google Analytics