`

Java之BigDecimal

    博客分类:
  • Java
阅读更多
参考资料
1 java.math.BigDecimal的用法
http://tech.e800.com.cn/articles/2009/525/1243215079206_1.html
http://jeelee.iteye.com/blog/652003
2 Java BigDecimal转换示例
http://www.blogjava.net/javagrass/archive/2011/07/04/353618.html
3 BigDecimal不整除的一个异常
http://zengbin163-gmail-com.iteye.com/blog/433862
请看以下代码
int sumInt = 0;
BigDecimal sumBd = new BigDecimal(0);		
for(int i=0;i<10;i++){
	sumInt += i;			
	sumBd.add(new BigDecimal(i));
}		
System.out.println("int sum : " + sumInt + ",BigDecimal sum : " + sumBd);	

打印结果BigDecimal sum为0
正确的做法是:在循环中这样设置
sumBd = sumBd.add(new BigDecimal(i));

Java也提供了BigInteger类,感觉这个类没用BigDecimal方便,BigInteger它没有接受int类型的构造函数.BigDecimal提供了四个常用方法
BigDecimal testBg1 = new BigDecimal(5);	
		BigDecimal testBg2 = new BigDecimal(3);	
		
		BigDecimal sumBg = testBg1.add(testBg2);
		System.out.println("testBg1: "+ testBg1 + ",testBg2: " +testBg2+",相加: " + sumBg);		
		BigDecimal subtractBg = testBg1.subtract(testBg2);
		System.out.println("testBg1: "+ testBg1 + ",testBg2: " +testBg2+",相减: " + subtractBg);
		BigDecimal multiplyBg = testBg1.multiply(testBg2);
		System.out.println("testBg1: "+ testBg1 + ",testBg2: " +testBg2+",相乘: " + multiplyBg);
		//注意以下相除会抛出异常,原因: 通过BigDecimal的divide方法进行除法时当不整除,出现无限循环小数时,就会抛异常
		//BigDecimal divideBg = testBg1.divide(testBg2);
		//System.out.println("testBg1: "+ testBg1 + ",testBg2: " +testBg2+",相除: " + divideBg);
		//解决方法是:设置精确度;就是给divide设置精确的小数点divide(xxxxx,2, BigDecimal.ROUND_HALF_EVEN) 
		//其中的第二个参数表示的是:保留小数点之后多少位
		BigDecimal divideBg = testBg1.divide(testBg2,10,BigDecimal.ROUND_HALF_EVEN);
		System.out.println("testBg1: "+ testBg1 + ",testBg2: " +testBg2+",相除: " + divideBg);

BigDecimal不整除抛出的异常,请设置精确度!
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
at java.math.BigDecimal.divide(BigDecimal.java:1278)
at main.Main.main(Main.java:41)

以下为网上抄录并且总结!
在java中,float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用java.math.BigDecimal
注意事项:如果需要精确计算,非要用String来够造BigDecimal
最后摘录网上的一个程序员写的精确工具类,在很多文章中都有此代码,可以参考下
import java.math.BigDecimal;

/**
 * @author Jstar 
 */
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();
	}
}
分享到:
评论

相关推荐

    java中BigDecimal的操作方法

    在Java编程语言中,BigDecimal是用于处理高精度和可配置精度的十进制数的类。在进行商业计算时,由于浮点数(double和float)存在精度问题,不能保证准确的结果,因此通常推荐使用BigDecimal来确保计算的精确性。本文...

    java BigDecimal操作

    总的来说,理解和熟练运用BigDecimal是每个Java开发者必备的技能之一,特别是在处理货币计算、财务计算等场景时,能够避免因为浮点数精度问题导致的错误。在使用BigDecimal时,一定要注意其性能开销,因为它比基本的...

    Java SE程序 BigDecimal类

    Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE...

    Java中BigDecimal的加减乘除、比较大小与使用注意事项

    在Java编程中,当涉及到需要精确数值计算的场景时,我们通常会使用`BigDecimal`类。这是因为`float`和`double`类型虽然适用于科学计算和工程计算,但它们基于二进制浮点运算,不能保证完全精确的结果。而`BigDecimal...

    关于java中BigDecimal的简介(csdn)————程序.pdf

    Java中的`BigDecimal`类是用于表示和操作高精度浮点数的重要工具,尤其适用于需要进行精确计算的场景,如财务和货币计算。由于基本数据类型`double`和`float`在进行大数值或高精度计算时可能会导致精度丢失,因此`...

    Java编程BigDecimal用法实例分享

    Java编程BigDecimal用法实例分享 Java中的BigDecimal类是Java标准库中的一部分,用于处理高精度的数字计算,特别是在商业计算中对数字精度要求较高的场景中。BigDecimal类提供了对大数字的操作,可以精确地计算货币...

    Java中BigDecimal类的使用详解

    Java中BigDecimal类的使用详解 Java中BigDecimal类是Java.math包中提供的一个API类,用于对超过16位有效位的数进行精确的运算。由于浮点数的精度问题,Java中浮点数的计算会失去一定的精确度。因此,使用BigDecimal...

    java-BigInteger-BigDecimal类源码

    在Java编程语言中,`BigInteger`和`BigDecimal`是两个重要的类,它们分别用于处理大整数和高精度浮点数。这两个类位于`java.math`包下,为开发者提供了超越基本数据类型(如int、long和double)的计算能力。在深入...

    Java中BigDecimal的基本运算(详解)

    Java中BigDecimal的基本运算详解 Java中的BigDecimal是一种高精度的数据类型,它可以用来表示非常大的整数和小数,提供了丰富的数学运算功能。下面我们将对Java中BigDecimal的基本运算进行详细的介绍。 构造方法 ...

    Java对BigDecimal常用方法的归类 -计算机等级考试-考试吧

    JAVA基础:java.math.BigDecimal的使用方法. JAVA基础:java.math.BigDecimal的使用方法.

    Java中BigDecimal类的简单用法

    因此,理解并熟练运用BigDecimal类是每个Java程序员必备的技能之一。在编写涉及精确数值计算的代码时,应优先考虑使用BigDecimal,以避免因浮点数不精确而导致的问题。同时,需要注意的是,BigDecimal的操作相对于...

    Java对BigDecimal常用方法的归类(加减乘除).doc

    Java 中 BigDecimal 的常用方法归类(加减乘除) Java 中的 BigDecimal 类提供了对浮点数的精确运算,包括加减乘除和四舍五入等操作。在 Java 中,简单类型不能够精确地对浮点数进行运算,因此需要使用 BigDecimal ...

    Java使用BigDecimal进行运算封装的实际案例

    "Java使用BigDecimal进行运算封装的实际案例" 今天,我们将讨论Java中使用BigDecimal进行运算封装的实际案例。BigDecimal是Java中一个用于处理精确数字计算的类,它提供了多种数学运算方法,如加法、减法、乘法、除...

    java.math.BigDecimal 操作类

    java.math.BigDecimal 操作类,包含加减乘除、String型加减乘除精度格式化转换计算等

    Java Bigdecimal使用原理详解

    Java Bigdecimal使用原理详解 Java Bigdecimal是Java语言中用于精确计算的类,它可以完善float和double类无法进行精确计算的缺憾。BigDecimal类位于java.math类包下,提供了多种构造函数和方法来实现精确计算。 ...

    Java BigDecimal类用法详解

    Java中的`BigDecimal`类是用来表示任意精度的十进制数,尤其适合于需要精确计算的商业和财务场景。它的核心概念包括非标度值(unscaled value)和标度(scale),非标度值是一个任意精度的整数,标度则是小数点后的...

    BigDecimal类

    BigDecimal 类是 Java 中的一种数值类型,主要用于处理超过 16 位有效数字的数值运算。该类提供了多种构造器和方法,用于创建和操作 BigDecimal 对象。 构造器 BigDecimal 类提供了四种构造器,用于创建不同的 ...

    BigDecimal工具类.docx

    BigDecimal工具类是Java中用于高精确处理常用数学运算的工具类。该工具类提供了多种精确的数学运算方法,包括加法、减法、乘法和除法等。 在BigDecimal工具类中,我们可以看到多个重载的方法,例如add方法和sub方法...

    浅谈java中BigDecimal类的简单用法

    相比之下,使用 `BigDecimal(String)` 构造函数创建 `new BigDecimal("0.1")` 将得到预期的0.1。当从 `double` 转换为 `BigDecimal` 时,建议使用 `BigDecimal.valueOf(double)` 方法,它会提供准确的转换。 ### ...

    BigDecimal开n次方根

    复杂的BigDecimal计算,需要开方的式子,可输入结果精确位数

Global site tag (gtag.js) - Google Analytics