`

Java浮点数精确计算实用类

阅读更多
package com.zx.test;

import java.math.BigDecimal;

/**
 * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精
 * 确的浮点数运算,包括加减乘除和四舍五入。
 */
public class NumberUtils {
	
    //默认除法运算精度
    private static final int DEF_DIV_SCALE = 10;
    //这个类不能实例化
    private NumberUtils(){
    }
 
    /**
     * 提供精确的加法运算。
     * @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();
    }
    
    public static void main(String args[]){
        double a=1;
        double b=3;
        double c=Math.round(33.523*100)/100;
        System.out.println(c);
    	double d=NumberUtils.round(33.3369589789, 2);
    	System.out.println(d);
    	
    	
    }


}

分享到:
评论

相关推荐

    浮点数精度问题

    1. **使用BigDecimal类**:Java提供了`java.math.BigDecimal`类,用于进行高精度的浮点数运算。它允许指定精度,并在计算过程中保持该精度,从而避免了浮点数的精度问题。 2. **比较浮点数时的容差**:直接比较两个...

    java房贷计算工具类(商贷、公积金、组合贷)

    总之,`CalculatorUtils.java`和`ArithUtil.java`这两个文件共同构建了一个全面的房贷计算框架,通过输入相关的贷款信息,用户可以得到精确的月供、利息总额等关键数据,这对于购房者来说是非常实用的工具。...

    经纬度计算距离、方位角等java源码

    总的来说,"Caculate.java"提供了一种实用的方法,用于处理基于经纬度的地理计算,这对于需要在地图应用中进行定位和导航的开发者来说是极其有价值的。通过深入理解这个源码,我们可以更好地理解和实现自己的地理...

    java 常用辅助工具类

    - `BigDecimal`:Java内置的高精度浮点数类,用于进行精确的数学计算,避免浮点数运算中的精度问题。 3. **数据库交互**: - `JDBC`(Java Database Connectivity):Java标准API,用于与各种数据库进行交互,...

    Java API学习.pdf

    另一个重要的包是`java.util`,它包含了许多实用工具类和接口,用于处理集合、日期时间、排序和遍历等任务: 1. **Arrays类**:提供了一组静态方法来操作数组,如排序、复制和填充数组。 2. **Vector类**:类似于...

    java源码整理包

    理解这些类的用法有助于处理大规模或需要精确计算的场景。 6. **布尔(Boolean)**:`Boolean`类是Java中的封装类,用于处理布尔值。虽然基本类型`boolean`已经足够日常使用,但在某些情况下,如使用`equals()`方法或...

    Effactive java(english pdf)

    10. **避免使用浮点数进行精确计算**: 浮点数运算不总是精确的,尤其是在涉及货币或其他需要精确值的场景。应优先使用BigDecimal处理精确计算。 11. **了解并使用泛型**: 泛型可以提供编译时类型检查,防止类型转换...

    Java实用经验总结--日期、数字篇

    - 当需要处理大整数或高精度浮点数时,可以使用 `BigInteger` 和 `BigDecimal` 类,它们提供不受平台限制的精确计算。 4. **日期和数字的转换** - 在处理日期字符串和日期对象之间转换时,`SimpleDateFormat....

    多种java常用API

    3. **Date**: `java.util.Date`类代表了特定的瞬间,精确到毫秒。它可以用来表示日期和时间,但需要注意的是,由于历史原因,`Date`类的设计并不完美,现在通常推荐使用`java.time`包中的`LocalDateTime`等类来处理...

    Effective-Java-2nd-Edition-(May-2008).zip_effective java

    9. **避免使用浮点数进行精确计算**:由于浮点数计算的不精确性,书中建议在需要精确结果的情况下使用BigDecimal类。 10. **优先考虑使用标准库**:鼓励开发者充分利用Java标准库提供的功能,如Collections框架、I/...

    Effictive Java

    14. **避免使用浮点数进行精确计算**:浮点数运算在Java中可能存在精度问题,对于需要精确结果的计算,应使用BigDecimal类。 15. **并发编程**:理解和使用并发工具类,如ExecutorService、Semaphore、...

    java 超详细api参考文档

    9. **java.math**:提供大整数(BigInteger)和高精度浮点数(BigDecimal)运算,适合需要精确计算的场景。 10. **java.text**:包含国际化和格式化相关的类,如NumberFormat、DateFormat,用于处理数字和日期的...

    java工具类库

    此外,如果需要进行复杂的数学计算,可以使用`BigDecimal`类来处理精确的浮点数运算,避免因浮点数精度问题导致的误差。 3. **字符串操作**: `String`类是Java中最常用的数据类型之一,提供了大量方法如`...

    java贷款计算器

    在Java编程领域,"java贷款计算器"是一个实用的工具,用于计算商业贷款、公积金贷款以及提前还款的各种场景。这个计算器程序通常会包含等额本金、等额本息这两种常见的还款方式,以满足用户的不同需求。这里我们将...

    计算器(java代码)

    4. **数值运算**:在Java中,`java.math`包提供了`BigDecimal`类,用于进行精确的浮点数运算,防止因浮点数计算误差导致的结果不准确。对于整数运算,可以直接使用内置的整数类型如`int`和`long`。 5. **堆栈数据...

    java笔记java笔记java笔记

    - **`BigDecimal`类**:用于表示任意精度的浮点数,适用于金融计算等场合。 - **数学运算**:包括加减乘除、取模、指数等操作,以及一些高级的数学函数。 #### 五、`java.net`包 `java.net`包提供了网络通信的基本...

    utils_java_page_usjz9_

    首先,`BigDecimal`是Java中处理大数和精确浮点计算的类,避免了浮点数运算的不精确性。在Java测试中,`BigDecimal`工具类可能提供了如格式化、比较、四舍五入等便捷方法,帮助开发者更方便地进行数值计算和验证。 ...

    java做的科学计算器(支持+-*/括号)

    `BigDecimal`类则提供了精确的浮点数运算,它使用任意精度的十进制数,可以避免精度问题。在科学计算器中,`BigDecimal`使得我们能处理像π或e这样的无限不循环小数,以及进行大整数的乘法、除法、加法和减法操作,...

    Java开发编码规范手册

    **Double (双精度浮点数)**:Java中的double类型是一种浮点数类型,占用8个字节(64位)的存储空间,比float类型能表示更精确的小数点后数值。 **Char (字符型)**:Java中的char类型是一种字符类型,占用2个字节(16位...

Global site tag (gtag.js) - Google Analytics