转自:http://www.iteye.com/topic/39112
《Effective Java》这本书中提到,float和double只能用来做科学计算或者
是工程计算,在商业计算中我们要用 java.math.BigDecimal。BigDecimal,一共有4个够造
方法,如果需要精确计算,非要用String来够造BigDecimal不可!
给一个网上的流传的工具类Arith:
Java代码
import java.math.BigDecimal;
/**
* 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精
* 确的浮点数运算,包括加减乘除和四舍五入。
*/
public class Arith {
// 默认除法运算精度
private static final int DEF_DIV_SCALE = 10;
// 这个类不能实例化
private Arith() {
}
/**
* 提供精确的加法运算。
* @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();
}
}
记住,一定要用Double和double!
分享到:
相关推荐
首先,我们要了解Java在数值计算中的基本概念。Java作为一种强大的面向对象的编程语言,提供了丰富的数学库(如java.lang.Math),包含了许多基础的数学函数,如平方根、指数、对数等。然而,对于更复杂的数值计算...
总结,Java数值计算算法编程涵盖了基础数据类型与运算、数学库的使用、高精度计算、迭代与递归、数据结构应用、矩阵运算、并发处理以及面向对象设计等多个方面。理解并掌握这些知识点,能够帮助开发者在Java环境中...
共有数值计算中常用的Java方法近200个.内容包括:解线性代数方程组、插值、数值积分、特殊函数、函数逼近、随机数、排序、特征值问题、数据拟合、方程求根和非线性方程组求解、函数的极值和最优化、数据的统计描述...
Java数值计算算法编程是计算机科学中的一个重要领域,它涉及到如何使用Java语言进行高效且精确的数学运算。在Java中,数值计算涵盖了广泛的算法和技术,包括基本的算术运算、复杂数学函数、线性代数、微积分、概率...
由于计算机处理的是有限精度的浮点数,因此数值计算中可能会出现舍入误差,导致结果的不精确。理解并控制这种误差是数值分析的核心。实验中,学生会学习如何分析算法的误差性质,以及如何选择更优的算法来减少误差。...
java 数值计算的工具包,NASA数值计算工程师写的书 Java Number Crunchyer里面的源代码,和jar包
本资源"Java数值计算算法源代码"涵盖了复数运算、矩阵操作、线性方程组求解、非线性方程求解、插值法以及数值积分等多个关键领域,对于学习和实践Java数值计算具有很高的价值。 1. **复数运算**:复数是数学中的一...
数值计算方法--插值函数(java实现) 数值计算方法--插值函数(java实现) 数值计算方法--插值函数(java实现) 数值计算方法--插值函数(java实现) 数值计算方法--插值函数(java实现) 数值计算方法--插值函数(java实现) ...
- **并行计算**:利用Java的多线程特性,提高数值计算的效率。 这些Java程序可能没有注释,但是通过代码结构、函数调用以及算法的常见模式,可以推断出它们的功能和用途。对于学习者来说,这提供了一个很好的实践...
Java数值计算中,浮点环境是理解数值运算的关键。在Sun Studio11中,数值计算的基石是基于IEEE算法模型,这一模型定义了浮点数的存储和运算规则。IEEE算法,即Institute of Electrical and Electronics Engineers...
数值计算中,算法的稳定性关乎结果的可靠性。理解舍入误差、浮点数表示误差以及如何选择合适的算法以降低误差是数值计算的关键。 总的来说,这个"Java 常用数值算法集"包含了从基础计算到复杂优化的丰富内容,是...
总的来说,牛顿插值法在数值计算中有着重要的应用,特别是在需要通过离散数据点预测连续函数行为时。在Java中实现这个算法,不仅可以进行精确的数值计算,还能通过图形化展示来增强理解和验证。通过阅读和理解`test7...
8. **误差分析与数值稳定性**:数值计算中,理解算法的误差来源和数值稳定性至关重要。比如,浮点数运算的舍入误差、迭代算法的收敛性等都需要深入研究。 9. **数值解微分方程**:常微分方程(ODE)和偏微分方程...
数值计算中的全选主元,可以设置最小允许的主元。java编写
java 数值计算(英文版) chm文件
12. **数据排序与搜索**:快速排序、归并排序、二分查找等是数值计算中常见的数据操作,它们影响着算法的效率。 13. **错误与异常处理**:在数值计算中,可能会遇到除零错误、溢出等问题。了解如何处理这些异常对于...
1. **线性代数运算**:Java中的`Apache Commons Math`库提供了矩阵和向量的操作,包括求解线性方程组、矩阵乘法、特征值和特征向量计算等。例如,使用`LUDecomposition`类可以对矩阵进行LU分解,进而求解线性方程组...