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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值