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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM