java二進位制運算十進位制(精確運算)

慕華思弦發表於2018-05-15
public static void main(String[] args) {
		System.out.println(2.0-1.1);
	}
}
列印出來如圖所示,等於 0.8999999999999999 

為什麼呢?

java中的double值用在數學方面來運算是沒有問題.

但是在二進位制中,計算十分之一(1/10)就會出現無限迴圈的數.

同理在十進位制中,對三分之一進行運算會出現無限迴圈的數字.(1/3 => 0.333333333333)


怎麼不讓java編譯不出現這種情況呢 ! 

java就提供了一個類,專門做整數操作的(BigInteger),還有一個類專門做浮點型別操作的(BigDecimal),它們都是Number的子類.


在BigDecimal的類裡面有String構造器來構造.


例如在java編譯器裡,下面的乘法運算BigDecimal構造器,.

b1=獲得book的值+"" 轉成字串.

b2=獲得quantity的值.

b3=b1乘以(b2).

返回一個b3的double值.

public double getSubtotal(){
		/*
		 * 使用BigDecimal不會有誤差
		 * 要求必須使用String型別的構造器
		 */
		BigDecimal b1 = new BigDecimal(book.getCurrPrice() + "");	//一加 "" 就讓這個數變成字串了
		BigDecimal b2 = new BigDecimal(quantity + "");
		BigDecimal b3 = b1.multiply(b2);							//multiply 乘以
		return b3.doubleValue();
		// 轉換為上面的寫法	return book.getCurrPrice() * quantity;
	}
這樣使得在二進位制裡面的運算不會產生誤差.

相關文章