`
services
  • 浏览: 80661 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

java中精确的计算方法

    博客分类:
  • java
阅读更多
import java.math.BigDecimal;

public class MathExtend {

    //默认除法运算精度

    private static final int DEFAULT_DIV_SCALE = 10;


    /**
     * 提供精确的加法运算。
     *
     * @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 String add(String v1, String v2)

    {

        BigDecimal b1 = new BigDecimal(v1);

        BigDecimal b2 = new BigDecimal(v2);

        return b1.add(b2).toString();

    }


    /**
     * 提供精确的减法运算。
     *
     * @param v1
     * @param v2
     * @return 两个参数的差
     */

    public static double subtract(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 String subtract(String v1, String v2)

    {

        BigDecimal b1 = new BigDecimal(v1);

        BigDecimal b2 = new BigDecimal(v2);

        return b1.subtract(b2).toString();

    }


    /**
     * 提供精确的乘法运算。
     *
     * @param v1
     * @param v2
     * @return 两个参数的积
     */

    public static double multiply(double v1, double v2)

    {

        BigDecimal b1 = new BigDecimal(Double.toString(v1));

        BigDecimal b2 = new BigDecimal(Double.toString(v2));

        return b1.multiply(b2).doubleValue();

    }


    /**
     * 提供精确的乘法运算
     *
     * @param v1
     * @param v2
     * @return 两个参数的数学积,以字符串格式返回
     */

    public static String multiply(String v1, String v2)

    {

        BigDecimal b1 = new BigDecimal(v1);

        BigDecimal b2 = new BigDecimal(v2);

        return b1.multiply(b2).toString();

    }


    /**
     * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
     * <p/>
     * 小数点以后10位,以后的数字四舍五入,舍入模式采用ROUND_HALF_EVEN
     *
     * @param v1
     * @param v2
     * @return 两个参数的商
     */

    public static double divide(double v1, double v2)

    {

        return divide(v1, v2, DEFAULT_DIV_SCALE);

    }


    /**
     * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
     * <p/>
     * 定精度,以后的数字四舍五入。舍入模式采用ROUND_HALF_EVEN
     *
     * @param v1
     * @param v2
     * @param scale 表示需要精确到小数点以后几位。
     * @return 两个参数的商
     */

    public static double divide(double v1, double v2, int scale)

    {

        return divide(v1, v2, scale, BigDecimal.ROUND_HALF_EVEN);

    }


    /**
     * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
     * <p/>
     * 定精度,以后的数字四舍五入。舍入模式采用用户指定舍入模式
     *
     * @param v1
     * @param v2
     * @param scale      表示需要精确到小数点以后几位
     * @param round_mode 表示用户指定的舍入模式
     * @return 两个参数的商
     */

    public static double divide(double v1, double v2, int scale, int round_mode) {

        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, round_mode).doubleValue();

    }


    /**
     * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
     * <p/>
     * 小数点以后10位,以后的数字四舍五入,舍入模式采用ROUND_HALF_EVEN
     *
     * @param v1
     * @param v2
     * @return 两个参数的商,以字符串格式返回
     */

    public static String divide(String v1, String v2)

    {

        return divide(v1, v2, DEFAULT_DIV_SCALE);

    }


    /**
     * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
     * <p/>
     * 定精度,以后的数字四舍五入。舍入模式采用ROUND_HALF_EVEN
     *
     * @param v1
     * @param v2
     * @param scale 表示需要精确到小数点以后几位
     * @return 两个参数的商,以字符串格式返回
     */

    public static String divide(String v1, String v2, int scale)

    {

        return divide(v1, v2, DEFAULT_DIV_SCALE, BigDecimal.ROUND_HALF_EVEN);

    }


    /**
     * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
     * <p/>
     * 定精度,以后的数字四舍五入。舍入模式采用用户指定舍入模式
     *
     * @param v1
     * @param v2
     * @param scale      表示需要精确到小数点以后几位
     * @param round_mode 表示用户指定的舍入模式
     * @return 两个参数的商,以字符串格式返回
     */

    public static String divide(String v1, String v2, int scale, int round_mode)

    {

        if (scale < 0)

        {

  throw new IllegalArgumentException("The scale must be a positive integer or zero");

        }

        BigDecimal b1 = new BigDecimal(v1);

        BigDecimal b2 = new BigDecimal(v2);

        return b1.divide(b2, scale, round_mode).toString();

    }


    /**
     * 提供精确的小数位四舍五入处理,舍入模式采用ROUND_HALF_EVEN
     *
     * @param v     需要四舍五入的数字
     * @param scale 小数点后保留几位
     * @return 四舍五入后的结果
     */

    public static double round(double v, int scale)

    {

        return round(v, scale, BigDecimal.ROUND_HALF_EVEN);

    }

    /**
     * 提供精确的小数位四舍五入处理
     *
     * @param v          需要四舍五入的数字
     * @param scale      小数点后保留几位
     * @param round_mode 指定的舍入模式
     * @return 四舍五入后的结果
     */

    public static double round(double v, int scale, int round_mode)

    {

        if (scale < 0)

        {

 throw new IllegalArgumentException("The scale must be a positive integer or zero");

        }

        BigDecimal b = new BigDecimal(Double.toString(v));

        return b.setScale(scale, round_mode).doubleValue();

    }


    /**
     * 提供精确的小数位四舍五入处理,舍入模式采用ROUND_HALF_EVEN
     *
     * @param v     需要四舍五入的数字
     * @param scale 小数点后保留几位
     * @return 四舍五入后的结果,以字符串格式返回
     */

    public static String round(String v, int scale)

    {

        return round(v, scale, BigDecimal.ROUND_HALF_EVEN);

    }

    /**
     * 提供精确的小数位四舍五入处理
     *
     * @param v          需要四舍五入的数字
     * @param scale      小数点后保留几位
     * @param round_mode 指定的舍入模式
     * @return 四舍五入后的结果,以字符串格式返回
     */

    public static String round(String v, int scale, int round_mode)

    {

        if (scale < 0)

        {

        throw new IllegalArgumentException("The scale must be a positive integer or zero");

        }

        BigDecimal b = new BigDecimal(v);

        return b.setScale(scale, round_mode).toString();

    }

}


分享到:
评论

相关推荐

    Java实现的浮点类的精确计算

    总结一下,Java中的浮点数精确计算主要是通过`java.math.BigDecimal`类来实现的,而"Java实现的浮点类的精确计算"则可能是一个自定义工具类,封装了`BigDecimal`的操作,以提供方便、准确的浮点数计算服务。...

    解析Java中的精确计算方法.pdf

    总之,虽然Java的浮点数类型在日常编程中方便、易用,但在要求精确计算的领域,开发者必须意识到它们的局限性,并采用Decimal和BigDecimal类型来确保数值计算的精确无误。通过合理使用这些高精度数值类型,并掌握其...

    java版计算方法实验

    在本实验中,我们将深入探讨Java编程语言在实现计算方法中的应用。计算方法是计算机科学与数学的一个交叉领域,主要用于解决各种数值问题。这个实验由江科大的费小勇教授设计,旨在帮助学习者理解并掌握如何用Java来...

    Java 精确计算-double-float-String

    描述中提到的链接指向了一个具体的博客文章,虽然内容无法在此提供,但我们可以根据常规的Java精确计算方法来展开讨论。 通常,Java中的`double`和`float`类型在进行数学运算时由于二进制浮点数的表示方式,会存在...

    Java中实现浮点数的精确计算

    ### Java中实现浮点数的精确计算 在Java编程中,使用`float`和`double`类型...通过上述方法,可以在Java中实现浮点数的精确计算,解决因精度问题导致的误差。在实际开发中,根据应用场景选择合适的解决方案非常重要。

    java 日出日落时间计算

    Java代码可能会封装这些复杂的计算逻辑在一个静态方法或者工具类中,提供方便的接口供其他部分调用。 接着,我们转向C++实现。虽然C++标准库没有像Java那样提供强大的日期时间API,但开发者可以使用第三方库,如`...

    Java计算财务收益率XIRR

    在金融和会计领域,计算投资的内部收益率是评估投资回报的重要方法之一。XIRR(Extended Internal Rate of Return,扩展内部收益率)是Excel等电子表格软件中一个特定的函数,用于计算非定期现金流的内部收益率。...

    Java数值计算算法编程

    本文将深入探讨Java中实现数值计算的方法、工具和最佳实践。 首先,我们要理解Java的基础数据类型,包括整型(byte, short, int, long)、浮点型(float, double)以及它们在数值计算中的应用。Java的数据类型提供...

    java计算24节气

    3. **自定义公式或库**:由于Java标准库并未内置24节气的计算方法,开发者通常需要自定义算法或使用第三方库。算法可能涉及天文计算,如太阳黄经与公历日期的转换。例如,可以利用太阳黄经和地球公转周期(回归年)...

    数值计算 数值分析 实验 java

    本实验课程基于Java编程语言,旨在帮助学生理解和掌握数值计算方法,并通过实践加深对理论知识的运用。 首先,数值计算涉及一系列算法,如线性代数中的求解线性方程组、数值微积分中的数值积分和微分、数值优化中的...

    java数值计算算法编程

    Java数值计算算法编程是计算机科学中的一个重要领域,它涉及到如何使用Java语言进行高效且精确的数学运算。在Java中,数值计算涵盖了广泛的算法和技术,包括基本的算术运算、复杂数学函数、线性代数、微积分、概率...

    java 时间转换成精确的生辰八字

    在Java编程语言中,将时间转换为传统的生辰八字是一项有趣且富有挑战性的任务。生辰八字是中国传统文化中用于预测命运的一种方式,它基于农历日期和时间,包括年、月、日、时四个部分,每个部分对应一个天干地支。在...

    计算java对象的大小的方法

    - **JOL (Java Object Layout)**:由Azul Systems开发的轻量级库,通过反射和JNI技术来计算对象的精确大小。 6. **源码分析**:通过阅读JVM的源码,如OpenJDK,可以更深入地理解对象是如何在内存中布局的。 7. **...

    Java时间控件精确到秒

    - `java.util.Duration`类代表两个日期或时刻之间的时间间隔,可以精确到纳秒,通常用于计算两个时间点之间的差值。 - `java.time.Period`类则用于表示日期之间的间隔,如年、月、日。 6. **线程安全的计时器** ...

    JAVA版的WINDOWS计算器

    通过这个项目,开发者可以学习到如何在Java中创建图形用户界面(GUI)以及如何处理用户输入和执行相应的计算操作。 二、核心技术 1. Java Swing:作为Java的GUI库,Swing提供了丰富的组件,如按钮、文本框、标签等...

    java 使用静态成员变量计算内存中实例化的对象数目

    因此,这种方法对于短期统计和简单示例是有效的,但在复杂或长期运行的系统中,可能需要更精确的方法来跟踪对象的生命周期。 总的来说,使用静态成员变量来计算Java程序中实例化的对象数量是一种实用的技术,可以...

    java实现二十四节气计算

    2. **天文计算**:对于精确计算,我们需要理解太阳黄经(太阳在黄道上的度数)的概念。二十四节气对应着太阳黄经的特定值,如春分对应0度,夏至对应90度,以此类推。可以利用天文公式来计算给定日期的太阳黄经。 3....

    java字符串内存计算

    本文将深入探讨如何在Java中计算字符串所占用的内存空间,包括现有的计算方法、其局限性以及具体的计算公式。 #### 计算内存占用的传统方法及其局限性 在Java中,直接获取一个对象所占用的内存大小并非易事。常见...

Global site tag (gtag.js) - Google Analytics