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