在 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精确计算方法来展开讨论。 通常,Java中的`double`和`float`类型在进行数学运算时由于二进制浮点数的表示方式,会存在...
Java对浮点数的计算是不精确的,比如0.05+0.01结果不是0.06,而是0.060000000000000005,更有甚者,一个数除以0.0,Java是...该类提供了加减乘除四则运算的精确计算方式.在你处理数据的工程中,该类可以给你意想不到的惊喜
总结一下,Java中的浮点数精确计算主要是通过`java.math.BigDecimal`类来实现的,而"Java实现的浮点类的精确计算"则可能是一个自定义工具类,封装了`BigDecimal`的操作,以提供方便、准确的浮点数计算服务。...
java运算工具类,可以处理浮点数的精度丢失问题,可以实现精确计算,常用公共方法抽取,常用工具类11111111111111111111111111111111111111111111111111111111111111111111111111
### Java中实现浮点数的精确计算 在Java编程中,使用`float`和`double`类型进行浮点数计算时经常会遇到精度丢失的问题。这是因为浮点数在计算机内部是以二进制形式存储的,而某些十进制小数无法用二进制精确表示,...
JavaScript中的小数点精确计算是开发者经常会遇到的一个挑战。由于JavaScript内部使用的是IEEE 754标准来存储和处理浮点数,这可能导致在进行小数运算时出现精度丢失问题,尤其是在涉及大数字或者循环计算时。本篇将...
总之,虽然Java的浮点数类型在日常编程中方便、易用,但在要求精确计算的领域,开发者必须意识到它们的局限性,并采用Decimal和BigDecimal类型来确保数值计算的精确无误。通过合理使用这些高精度数值类型,并掌握其...
Java的数据类型提供了精确的数值存储和运算,但需要注意浮点型数据在进行计算时可能会有精度损失。 在Java中,基础的算术运算符如+、-、*、/和%用于执行基本的数学操作。对于复杂的数值计算,我们可以利用Java的...
Java Swing 实现的考勤工时计算工具是一个基于桌面应用的程序,专为处理和计算员工的出勤时间而设计。这个工具的核心功能是接收Excel报表中的考勤数据,然后利用SQLite数据库进行存储和处理,以得出精确的工作小时...
Java作为一种广泛使用的编程语言,同样可以实现XIRR的计算功能。本工程提供的就是一个Java实现XIRR的例子,它包含了测试类,可以直接运行并验证结果的准确性。 XIRR的计算基于现金流的时间价值理论,它考虑了资金的...
在IT领域,尤其是在软件开发中,精确地计算日出日落时间是一项常见的需求,比如用于气象应用、户外活动规划或者智能家居系统。这个压缩包提供的工具类可以帮助开发者在Java和C++环境中实现这一功能。下面我们将深入...
2. **节气算法**:计算24节气的算法基于太阳黄经度,每年大致固定,但具体到每一天需要精确计算。24节气包括立春、雨水、惊蛰、春分、清明、谷雨、立夏、小满、芒种、夏至、小暑、大暑、立秋、处暑、白露、秋分、...
Java数值计算算法编程是计算机科学中的一个重要领域,它涉及到如何使用Java语言进行高效且精确的数学运算。在Java中,数值计算涵盖了广泛的算法和技术,包括基本的算术运算、复杂数学函数、线性代数、微积分、概率...
通过这个项目,开发者可以学习到如何在Java中创建图形用户界面(GUI)以及如何处理用户输入和执行相应的计算操作。 二、核心技术 1. Java Swing:作为Java的GUI库,Swing提供了丰富的组件,如按钮、文本框、标签等...
"计算两个经纬度之间的距离Java"这个主题,涉及到地理坐标系统、Haversine公式以及高德地图API的运用。 首先,我们需要了解地理坐标系统。地球被抽象为一个球体,每个位置由经度和纬度来唯一标识。经度是从本初子午...
在Java编程语言中,计算两个日期之间相差的月数是一个常见的任务,这通常涉及到日期处理和时间计算。本文将深入探讨如何使用Java实现这个功能,包括标准库中的API以及一些高级方法。 首先,Java 8引入了`java.time`...
标题提到的"2+22+222+2222+22......2222精确计算"是一个典型的涉及大数运算的例子。当我们面对这样的无限序列时,传统的整数或浮点数类型无法存储或计算,因为它们有固定的位宽限制。例如,在大多数编程语言中,int...
在Java编程语言中,将时间转换为传统的生辰八字是一项有趣且富有挑战性的任务。...通过引入适当的库,编写相应的算法,我们可以创建一个精确到秒的生辰八字转换工具,这对于了解和研究中国传统文化具有重要意义。