Java使用BigDecimal解决精确计算的问题

最近有人在微信上给我发了一个数学题目,如下图:

我看了之后感觉很是简单,但是却想了半天才解出来。解出来后我想到了用程序再解一遍,然而精确计算的问题却让人头疼不已。

解题思路:

思路其实很简单,暴力求解就可以,但是当你写了一个四重for循环后你会发现解不出来。由此考虑到结果可能是小数,便把增量改成了float类型,每次自增0.1。

当你写完满心欢喜地运行的时候会发现还是出不来结果。再改成double类型也同样是不行。

这是因为java中float类型相加是把十进制转化为二进制后相加然后把二进制结果再转化成十进制。

于是使用java中自带的BigDecimal类进行计算。

当然使用BigDecimal类与值类型的int、float等有所不同。

1、声明一个BigDecimal

  BigDecimal b1=new BigDecimal("10");

这样就声明了一个引用b1指向值为10的BigDecimal对象。注意,BigDecimal的构造方法中的值为String类型。

2、BigDecimal的加减

  add:

import java.math.BigDecimal;

public class test3 {
	public static void main(String[] args) {
		BigDecimal b1=new BigDecimal("1.12");
		BigDecimal b2=new BigDecimal("2.14");
		System.out.println(b1.add(b2));
	}
}

  运行结果为:3.26

  substract:

import java.math.BigDecimal;

public class test4 {
	public static void main(String[] args) {
		BigDecimal b1=new BigDecimal("1.12");
		BigDecimal b2=new BigDecimal("2.14");
		System.out.println(b1.subtract(b2));
	}
}

  运行结果为:-1.02

  PS:乘和除也有对应的方法,此处不再展示。

3、BigDecimal的for循环

import java.math.BigDecimal;

public class test3 {
	public static void main(String[] args) {
		for(BigDecimal b1=new BigDecimal("1.0");
				b1.compareTo(new BigDecimal("5"))!=1;
				b1=b1.add(new BigDecimal("0.1"))){
			System.out.println(b1);
		}
	}
}

  使用BigDecimal做for循环需要使用BigDecimal中的compareTo方法做判断。compareTo方法判断为true会返回1,否则返回0。

4、解题方法

import java.math.BigDecimal;

public class test2 {
	public static void main(String[] args) {
		for (BigDecimal a = new BigDecimal("0");
				a.compareTo(new BigDecimal("10")) != 1;
				a = a.add(new BigDecimal("0.1"))) {
			for (BigDecimal b = new BigDecimal("0");
					b.compareTo(new BigDecimal("10")) != 1;
					b = b.add(new BigDecimal("0.1"))) {
				for (BigDecimal c = new BigDecimal("0");
						c.compareTo(new BigDecimal("10")) != 1;
						c = c.add(new BigDecimal("0.1"))) {
					for (BigDecimal d = new BigDecimal("0");
							d.compareTo(new BigDecimal("10")) != 1;
							d = d.add(new BigDecimal("0.1"))) {
						if ((a.add(b)).equals(new BigDecimal("9.0"))
								&& b.add(d).equals(new BigDecimal("10.0"))
								&& a.add(c).equals(new BigDecimal("10.0"))
								&& c.subtract(d).equals(new BigDecimal("6.0")) )
							System.out.println(a + "| " + b + " |  " + c + " | " + d);
					}
				}
			}
		}

	}
}

  恐怖的四重BigDecimal的for循环。

  运行结果:1.5| 7.5 |  8.5 | 2.5

时间: 2024-12-30 02:58:11

Java使用BigDecimal解决精确计算的问题的相关文章

java精确计算之BigDecimal

Java中的计算主要有double,float,int,long,BigDecimal 1.float和double主要用户科学计算和工程计算,它们执行二进制浮点运算,这是为了在广泛的数值范围上提供较为精确的快速近似计算而设计的.然而它们并没有提供完全精确的结果,所以不应该被用于需要精确计算的场合. eg: double double_price1 = 1.03;  double double_price2 = 0.42;  System.out.println("double的计算值:&quo

JAVA中精确计算金额BigDecimal

package com.chauvet.utils; import java.math.BigDecimal;import java.text.DecimalFormat;import java.text.NumberFormat; /*** * * 金额 * * 如果需要精确计算,必须用String来够造BigDecimal! !! * * Java里面的商业计算,不能用float和double,因为他们无法 进行精确计算. * 但是Java的设计者给编程人员提供了一个很有用的类BigDeci

java的数字精确计算问题-BigDecimal

java的数字运算,偶尔喝出现精度的问题,以下阐述的 java的BigDecimal类的使用. 例如: System.out.println(0.9+0.3); 结果1.2 System.out.println(1.9+0.3); 结果2.1999999999999997 System.out.println(1.9+0.4); 结果2.3 java为了让float或者double类型能够精确的计算,提供了BigDecimal类. 示例如下: public static BigDecimal g

Java中浮点型数据Float和Double进行精确计算的问题

一.浮点计算中发生精度丢失  大概很多有编程经验的朋友都对这个问题不陌生了:无论你使用的是什么编程语言,在使用浮点型数据进行精确计算时,你都有可能遇到计算结果出错的情况.来看下面的例子. // 这是一个利用浮点型数据进行精确计算时结果出错的例子,使用Java编写,有所省略. double a = (1.2 - 0.4) / 0.1;System.out.println(a); 如果你认为这个程序的输出结果是“8”的话,那你就错了.实际上,程序的输出结果是“7.999999999999999”.好

Java浮点数float和double精确计算的精度误差问题总结

1.float整数计算误差 案例:会员积分字段采用float类型,导致计算会员积分时,7位整数的数据计算结果出现误差. 原因:超出float精度范围,无法精确计算. float和double的精度是由尾数的位数来决定的.浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响. float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字: double:2^5

Java精确计算

Java精确计算 如果我们编译运行下面这个程序会看到什么? public class Test{ public static void main(String args[]){ System.out.println(0.05+0.01); System.out.println(1.0-0.42); System.out.println(4.015*100); System.out.println(123.3/100); } } 你没有看错!结果确实是 0.060000000000000005 0

java.math.BigDecimal保留两位小数,保留小数,精确位数

http://blog.csdn.net/yuhua3272004/article/details/3075436 使用java.math.BigDecimal工具类实现 java保留两位小数问题: 方式一(四舍五入形式保留两位小数,注意模式ROUND_HALF_UP): 四舍五入   double   f   =   111231.5585;   BigDecimal   b   =   new   BigDecimal(f);   double   f1   =   b.setScale(2

解决java.math.BigDecimal divide方法运算结果为无限小数问题

http://samueli.iteye.com/blog/224755 BigDecimal除法运算报错,错误如下:Non-terminating decimal expansion; no exact representable decimal result 原因是: BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) if divisor is zero, roundingMode==ROUND_UNNECE

金融项目java开发_BigDecimal(解决计算精度问题)

当使用double进行商业运算时,double计算会丢失精度.可以使用BigDecimal进行计算. [java] view plain copy print? import java.math.BigDecimal; import org.junit.Test; public class TestBigDecimal{ @Test public void test(){ double a=0.1; double b=0.2; System.out.println(a+b); BigDecima