`
wxinpeng
  • 浏览: 582243 次
  • 性别: 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 常用的数值算法例子和Numerical Analysis for Statisticians数值分析英文版pdf

    关于java的数值精度

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

    java数学计算工具类 double精确的加法算法 double精确的减法算法

    java数学计算工具类 double精确的加法算法 double精确的减法算法 精确的乘法算法 对精确的除法运算,当发生除不尽的 保留小数、数值精度

    Java代码.zip

    (3)编写一个Java Application程序Compute.java,用来显示某一个圆柱体中心坐标位置(如图1中的k的位置),高度h,以及它的表面积(不包括两个底的面积)、体积和底面积。要求圆半径r,圆心坐标x和y,以及高度h的值均从...

    史上最全Java面试题目大集合

    面向对象计算始于这个基本概念,20. 即现实世界可以被描绘成一系列完全自治、封装的对象,21. 这些对象通过一个受保护的接口访问其他对象。 22. 多态性:多态性是指23. 允许不同24. 类的对象对同25. 一消息作出响应...

    Java程序员面试宝典

    面向对象计算始于这个基本概念, 即现实世界可以被描绘成一系列完全自治、封装的对象, 这些对象通过一个受保护的接口访问其他对象。 (4).多态性:多态性是指: 允许不同 类的对象对同一消息作出响应。多态性包括...

    java常用工具类的使用

    Q 老师,时间毫秒值从1970年1月1日0:00.000开始计算,上面示例中10年后应该是1980年1月1日0:00.000,为什么输出结果是:1980年1月1日 8:00呢? A java.util.Date类型表示的是GMT时间,本身输出是国际化输出,...

    JAVA面试题最全集

    如何将数值型字符转换为数字(Integer,Double) 如何将数字转换为字符 如何取小数点前两位,并四舍五入。 4.日期和时间 如何取得年月日,小时分秒 如何取得从1970年到现在的毫秒数 如何获取某个日期是当月的...

    个人开发中遇到常见问题及解决办法(吐血总结)

    2 java中double类型数据运算不精确问题的解决办法(采用java.math.BigDecimal类来进行精确计算。) 3 get方式传值乱码问题解决 4 查询被锁的数据,解锁 ,数据库连接数 5 下拉框的数据回显 6 mybatis批量更新,批量...

    java综合试题(面试题)

    13. Java语言中的浮点型数据根据数据存储长度和数值精度的不同,进一步分为哪两种具体类型,各占二进制的多少位? 16.字符串 ”\’a\’” 的长度是( )3 13. float 32位、double 64位 24.表达式2*5/2.5、1.0/2*5、...

    java面试笔试题大汇总

    面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4. 多态性: 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化...

    java 面试题 总结

    面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4. 多态性: 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多...

    Java 和 C/C++ 的对比试验报告+代码

    设计一个实验,通过 n!的运算,了解不同数据类型在内部存储上的差别。用不同数据类型进行结果值...2. Java 的 数值类型 整型 和 浮点 计算过程中注意类型不能 混用 3. 关注在不同的程序语言环境下,关键语句的差异。

    java面试题

    面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4. 多态性: 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多...

    Java BigDecimal详解_动力节点Java学院整理

    借用《Effactive Java》这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供...

    达内 coreJava 习题答案

    其中a为1至9之中的一个数,项数也要可以指定。 import java.util.Scanner; class Multinomial{ public static void main(String[] args){ int a; //定义输入的 a int howMany; //定义最后的一项有多少个数字 ...

    积分java源码-JavaCalculus:用于字符串表达式、符号微分、符号积分以及代数和函数组合(FoG)的Java微积分数学包

    积分java源码欢迎来到 ...double(函数值) 微分接口:获取字符串方程的符号微分。 输入:Java 字符串 (f(x)) 输出:f(x) 的微分:f'(x) 积分接口:获得字符串方程的符号积分。 输入:Java 字符串 ( f(x) ) 输出

    2.Java基础语法.ppt

    两个操作数中只要有一个是double类型,那么结果是double类型的数据 (2) “+”号的作用 1.表示正数 2.相加运算 3.字符串拼接 在单独运算的时候 ++i,i++ 没有任何区别,都是加1操作相当于 i=i+1 i++;先运算,后...

    JVM面试总结

    Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少...不支持IEEE格式的较旧的计算机,在运行Java数值计算程序时,可能会非常慢。

    Java语言程序设计(一)真题及答案.doc

    在Java语言中,switch关键字之后的表达式的计算结果不能是()。 A.char型 B.int型 C.short型 D.10n9型 正确答案:D 您的答案: 本题解析: 暂无解析 20.在Java语言中,类的多个实例对象所共享的变量被称为()。 A.静态...

Global site tag (gtag.js) - Google Analytics