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

java中Double数值的计算。

 
阅读更多

double的计算不精确,会有类似0.0000000000000002的误差,正确的方法是使用BigDecimal或者用整型

 整型地方法适合于货币精度已知的情况,比如12.11+1.10转成1211+110计算,最后再/100即可

 以下是摘抄的BigDecimal方法:

 

/**
 * double的计算不精确,会有类似0.0000000000000002的误差,正确的方法是使用BigDecimal或者用整型
 整型地方法适合于货币精度已知的情况,比如12.11+1.10转成1211+110计算,最后再/100即可
 以下是摘抄的BigDecimal方法:
 */
import java.io.Serializable;
import java.math.BigDecimal;
import org.springframework.stereotype.Component;

@Component
public class DoubleUtil implements Serializable {
	private static final long serialVersionUID = -3345205828566485102L;
	// 默认除法运算精度
	private static final Integer DEF_DIV_SCALE = 2;

	/**
	 * 提供精确的加法运算。
	 * @param value1 被加数
	 * @param value2 加数
	 * @return 两个参数的和
	 */
	public Double add(Number value1, Number value2) {
		BigDecimal b1 = new BigDecimal(Double.toString(value1.doubleValue()));
		BigDecimal b2 = new BigDecimal(Double.toString(value2.doubleValue()));
		return b1.add(b2).doubleValue();
	}

	/**
	 * 提供精确的减法运算。
	 * 
	 * @param value1
	 *            被减数
	 * @param value2
	 *            减数
	 * @return 两个参数的差
	 */
	public double sub(Number value1, Number value2) {
		BigDecimal b1 = new BigDecimal(Double.toString(value1.doubleValue()));
		BigDecimal b2 = new BigDecimal(Double.toString(value2.doubleValue()));
		return b1.subtract(b2).doubleValue();
	}

	/**
	 * 提供精确的乘法运算。
	 * 
	 * @param value1
	 *            被乘数
	 * @param value2
	 *            乘数
	 * @return 两个参数的积
	 */
	public Double mul(Number value1, Number value2) {
		BigDecimal b1 = new BigDecimal(Double.toString(value1.doubleValue()));
		BigDecimal b2 = new BigDecimal(Double.toString(value2.doubleValue()));
		return b1.multiply(b2).doubleValue();
	}

	/**
	 * 提供(相对)精确的除法运算,当发生除不尽的情况时, 精确到小数点以后10位,以后的数字四舍五入。
	 * 
	 * @param dividend
	 *            被除数
	 * @param divisor
	 *            除数
	 * @return 两个参数的商
	 */
	public Double div(Double dividend, Double divisor) {
		return div(dividend, divisor, DEF_DIV_SCALE);
	}

	/**
	 * 提供(相对)精确的除法运算。 当发生除不尽的情况时,由scale参数指定精度,以后的数字四舍五入。
	 * 
	 * @param dividend
	 *            被除数
	 * @param divisor
	 *            除数
	 * @param scale
	 *            表示表示需要精确到小数点以后几位。
	 * @return 两个参数的商
	 */
	public Double div(Double dividend, Double divisor, Integer scale) {
		if (scale < 0) {
			throw new IllegalArgumentException(
					"The scale must be a positive integer or zero");
		}
		BigDecimal b1 = new BigDecimal(Double.toString(dividend));
		BigDecimal b2 = new BigDecimal(Double.toString(divisor));
		return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	/**
	 * 提供精确的小数位四舍五入处理。
	 * 
	 * @param value
	 *            需要四舍五入的数字
	 * @param scale
	 *            小数点后保留几位
	 * @return 四舍五入后的结果
	 */
	public Double round(Double value, Integer scale) {
		if (scale < 0) {
			throw new IllegalArgumentException(
					"The scale must be a positive integer or zero");
		}
		BigDecimal b = new BigDecimal(Double.toString(value));
		BigDecimal one = new BigDecimal("1");
		return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}
}
 
分享到:
评论
2 楼 Long_yuan 2014-05-27  
new BigDecimal(Double.toString(value1.doubleValue()))

BigDecimal有double的构造方法吧 为什么还要转换成String来构造
1 楼 黑色幽默_cool 2013-07-02  
好使,真心好使

相关推荐

    Java数值计算算法编程

    首先,我们要理解Java的基础数据类型,包括整型(byte, short, int, long)、浮点型(float, double)以及它们在数值计算中的应用。Java的数据类型提供了精确的数值存储和运算,但需要注意浮点型数据在进行计算时...

    java数值计算算法编程

    在数值计算中,理解和掌握这些数据类型的范围、精度以及它们之间的转换至关重要。运算符如加减乘除、取余、位操作等也是基础,它们用于构建复杂的数学表达式。 2. **复数运算**:除了基本的实数运算,Java还支持...

    Java Double相加出现的怪事

    在《Effective Java》这本书中也提到这个原则,float 和 double 只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal。BigDecimal 一共有 4 个够造方法,我们可以使用 BigDecimal(double ...

    Java Double 精度问题总结

    在Java编程语言中,`double` 类型是一种用于表示64位浮点数的原始数据类型。虽然 `double` 提供了相对较高的精度,但在涉及精确数学运算(特别是涉及到小数值)时,由于其内部采用二进制浮点数格式存储,仍会出现...

    test2_JavaDouble类型比较大小_java编程_

    标题"test2_JavaDouble类型比较大小_java编程_"提示我们关注的是Java中`Double`类型的比较操作。通常,我们可能会像处理整数那样直接使用`&gt;`或`来比较两个`Double`值,例如`double a = 0.1; double b = 0.2; if (a +...

    java 常用的数值算法例子

    1. **线性代数运算**:Java中的`Apache Commons Math`库提供了矩阵和向量的操作,包括求解线性方程组、矩阵乘法、特征值和特征向量计算等。例如,使用`LUDecomposition`类可以对矩阵进行LU分解,进而求解线性方程组...

    Java 常用数值算法集

    数值计算中,算法的稳定性关乎结果的可靠性。理解舍入误差、浮点数表示误差以及如何选择合适的算法以降低误差是数值计算的关键。 总的来说,这个"Java 常用数值算法集"包含了从基础计算到复杂优化的丰富内容,是...

    Java 精确计算-double-float-String

    标题中的"Java 精确计算 - double-float-String"指向的是Java中处理浮点数(double和float)以及字符串表示的数值时可能遇到的精度问题,以及如何通过特定方法实现精确计算。描述中提到的链接指向了一个具体的博客...

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

    在Java中,浮点数(float和double)是基于IEEE 754标准的,它们使用二进制浮点表示法,这导致在进行除法、乘法、加法和减法等操作时可能会出现非预期的精度损失。例如,两个看似相等的浮点数在计算后可能因为舍入...

    java 公式计算汇总,直接调用其方法即可进行运算

    在Java编程语言中,公式计算是一项常见的需求,特别是在科学计算、数据分析、数学建模等领域。为了简化这方面的代码编写,开发者经常会将各种计算操作封装成方法,以便在项目中直接调用。标题“java 公式计算汇总,...

    java 求对数值的资源

    在Java编程语言中,求对数是常见的数学...总的来说,Java提供了丰富的数学工具来计算对数,使得开发者可以轻松地在代码中实现对数运算。理解并熟练运用这些方法,将有助于解决各种涉及指数运算的问题,提升编程效率。

    java数值方法

    这些函数在数值计算中极为常见。 3. **线性代数**:在解决多变量问题时,矩阵和向量操作是必不可少的。虽然Java标准库没有提供完整的线性代数支持,但有第三方库如Apache Commons Math或JAMA可以辅助实现。 4. **...

    java标准分计算(修改版)

    标准分是指一组数据中每个数值与平均值的偏差程度,通常用于衡量数据的相对位置。此方法可以应用于多种场景,例如教育领域的成绩分析、数据分析等。 ### 二、代码解析 #### 2.1 类结构 - **包名**:`comm` - **...

    关于java的数值精度

    java程序中数值的精度问题,float、double容易产生精度数值问题,不适合精度计算,而bigdecimal正好解决这一问题

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

    例如,在金融计算中,需要非常精确的计算结果,例如计算利息、计算投资回报等。使用Decimal和BigDecimal类型可以提供非常精确的计算结果,从而避免了浮点数的舍入误差。 浮点数在Java语言中是一种常用的数值类型,...

    Java-简单计算机

    它展示了一个完整的计算流程,从获取用户输入到执行运算再到显示结果,是Java初学者的一个良好起点。通过深入这个项目,开发者可以进一步理解和掌握面向对象编程的概念,如类、对象、方法以及输入/输出处理。

    JAVA案例 第二篇:针对大数值取整数和小数、保留几位小数、特定位数的数值、自幂数.docx

    在JAVA编程中,处理数值运算是一项常见的任务,尤其是在涉及到大数值的时候。本篇文章将深入探讨如何在不涉及精度处理和不使用强制类型转换的情况下,进行取整、取小数、保留特定位数的小数以及计算自幂数的操作。...

    解决java数值范围以及float与double精度丢失的问题

    下面我们将详细探讨Java中的数值范围、float和double类型的精度问题,并且提供解决方案。 一、Java中的数值范围 Java中的基本数据类型有多种,包括整数类型(int、long)、浮点数类型(float、double)。每种类型...

    java对double数组排序示例分享

    `double`数组通常用于存储浮点数值,例如在科学计算、统计分析或任何需要精确小数点后数字的场景中。下面,我们将深入探讨Java对`double`数组排序的实现方法以及代码中的关键细节。 首先,让我们看一下提供的代码...

Global site tag (gtag.js) - Google Analytics