`

JAVA 精确计算

    博客分类:
  • Java
阅读更多
在 Java 程序中使用浮点数和小数充满着陷阱。浮点数和小数不象整数一样“循规蹈矩”,不能假定浮点计算一定产生整型或精确的结果,虽然它们的确“应该”那样做。最好将浮点运算保留用作计算本来就不精确的数值,譬如测量。如果需要表示定点数(譬如,几美元和几美分),则使用 DE>BigDecimalDE> 。

import java.math.BigDecimal;
import java.text.DecimalFormat;

/**
*   由于Java的基本数据类型不能够对浮点数进行精确运算,
* 这个工具类提供精确的浮点数运算,包括加减乘除和四舍五入。
*/
public class Arithmetic4Double {
   //默认除法运算精度
   private static final int DEF_DIV_SCALE = 10;
 
   //所有方法均用静态方法实现,不允许实例化
   private Arithmetic4Double() {}

   /**
    * 实现浮点数的加法运算功能
    * @param v1 加数1
    * @param v2 加数2
    * @return v1+v2的和
    */
   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 v1-v2的差
    */
   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 v1×v2的积
    */
   public static double multi(double v1,double v2) {
       BigDecimal b1 = new BigDecimal(Double.toString(v1));
       BigDecimal b2 = new BigDecimal(Double.toString(v2));
       return b1.multiply(b2).doubleValue();
   }

   /**
    * 实现浮点数的除法运算功能
    * 当发生除不尽的情况时,精确到小数点以后DEF_DIV_SCALE位(默认为10位),后面的位数进行四舍五入。
    * @param v1 被除数
    * @param v2 除数
    * @return v1/v2的商
    */
   public static double div(double v1,double v2) {
    if (v2 == 0d) {
           throw new IllegalArgumentException(
               "The v2 can not equal zero");
       }
    BigDecimal b1 = new BigDecimal(Double.toString(v1));
       BigDecimal b2 = new BigDecimal(Double.toString(v2));
       return b1.divide(b2,DEF_DIV_SCALE,BigDecimal.ROUND_HALF_UP).doubleValue();
   }

   /**
    * 实现浮点数的除法运算功能
    * 当发生除不尽的情况时,精确到小数点以后scale位,后面的位数进行四舍五入。
    * @param v1 被除数
    * @param v2 除数
    * @param scale 表示需要精确到小数点以后几位
    * @return v1/v2的商
    */
   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 du = div(-1, 1);
       DecimalFormat df = new DecimalFormat("#####################.###############");
       System.err.println(df.format(du).toString());
   }
}
分享到:
评论

相关推荐

    Java 精确计算-double-float-String

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

    java精确计算浮点数工具类

    Java对浮点数的计算是不精确的,比如0.05+0.01结果不是0.06,而是0.060000000000000005,更有甚者,一个数除以0.0,Java是...该类提供了加减乘除四则运算的精确计算方式.在你处理数据的工程中,该类可以给你意想不到的惊喜

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

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

    运算工具类实现精确计算

    java运算工具类,可以处理浮点数的精度丢失问题,可以实现精确计算,常用公共方法抽取,常用工具类11111111111111111111111111111111111111111111111111111111111111111111111111

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

    "Java中的精确计算方法" Java语言中,浮点数是一种常用的数值类型,但是它并不是非常精确的。浮点数的计算结果可能会出现舍入误差,导致结果不符合预期。这种情况在金融计算、科学计算等领域中尤其重要。 IEEE 754...

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

    ### Java中实现浮点数的精确计算 在Java编程中,使用`float`和`double`类型进行浮点数计算时经常会遇到精度丢失的问题。这是因为浮点数在计算机内部是以二进制形式存储的,而某些十进制小数无法用二进制精确表示,...

    JavaScript小数点精确计算

    JavaScript中的小数点精确计算是开发者经常会遇到的一个挑战。由于JavaScript内部使用的是IEEE 754标准来存储和处理浮点数,这可能导致在进行小数运算时出现精度丢失问题,尤其是在涉及大数字或者循环计算时。本篇将...

    Java数值计算算法编程

    Java的数据类型提供了精确的数值存储和运算,但需要注意浮点型数据在进行计算时可能会有精度损失。 在Java中,基础的算术运算符如+、-、*、/和%用于执行基本的数学操作。对于复杂的数值计算,我们可以利用Java的...

    java swing实现考勤工时计算工具

    Java Swing 实现的考勤工时计算工具是一个基于桌面应用的程序,专为处理和计算员工的出勤时间而设计。这个工具的核心功能是接收Excel报表中的考勤数据,然后利用SQLite数据库进行存储和处理,以得出精确的工作小时...

    Java计算财务收益率XIRR

    Java作为一种广泛使用的编程语言,同样可以实现XIRR的计算功能。本工程提供的就是一个Java实现XIRR的例子,它包含了测试类,可以直接运行并验证结果的准确性。 XIRR的计算基于现金流的时间价值理论,它考虑了资金的...

    java 日出日落时间计算

    在IT领域,尤其是在软件开发中,精确地计算日出日落时间是一项常见的需求,比如用于气象应用、户外活动规划或者智能家居系统。这个压缩包提供的工具类可以帮助开发者在Java和C++环境中实现这一功能。下面我们将深入...

    java计算24节气

    2. **节气算法**:计算24节气的算法基于太阳黄经度,每年大致固定,但具体到每一天需要精确计算。24节气包括立春、雨水、惊蛰、春分、清明、谷雨、立夏、小满、芒种、夏至、小暑、大暑、立秋、处暑、白露、秋分、...

    java数值计算算法编程

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

    JAVA版的WINDOWS计算器

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

    计算两个经纬度之间的距离Java

    "计算两个经纬度之间的距离Java"这个主题,涉及到地理坐标系统、Haversine公式以及高德地图API的运用。 首先,我们需要了解地理坐标系统。地球被抽象为一个球体,每个位置由经度和纬度来唯一标识。经度是从本初子午...

    2+22+222+2222精确计算

    标题提到的"2+22+222+2222+22......2222精确计算"是一个典型的涉及大数运算的例子。当我们面对这样的无限序列时,传统的整数或浮点数类型无法存储或计算,因为它们有固定的位宽限制。例如,在大多数编程语言中,int...

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

    在Java编程语言中,将时间转换为传统的生辰八字是一项有趣且富有挑战性的任务。...通过引入适当的库,编写相应的算法,我们可以创建一个精确到秒的生辰八字转换工具,这对于了解和研究中国传统文化具有重要意义。

    Java 计算两个日期之间相差的月数

    在Java编程语言中,计算两个日期之间相差的月数是一个常见的任务,这通常涉及到日期处理和时间计算。本文将深入探讨如何使用Java实现这个功能,包括标准库中的API以及一些高级方法。 首先,Java 8引入了`java.time`...

Global site tag (gtag.js) - Google Analytics