浮點數定義
在計算機科學中,浮點(英語:floating point,縮寫為FP)是一種對于實數的近似值數值表現法,由一個有效數字(即尾數)加上冪數來表示,通常是乘以某個基數的整數次指數得到。以這種表示法表示的數值,稱為浮點數(floating-point number)。
浮點數表示方式
對浮點數的誤用
讓我們來看看下面這段代碼(這段代碼在jdk1.6中測試過)
double PI = 3.14;
System.out.println(PI*10);
通常新手會錯誤的認為會輸出31.4,但是事實卻并不是這樣,這段代碼會輸出31.400000000000002。
為什么會出現這樣的輸出結果呢?
我們得從浮點數在計算機中的存儲結構說起。
由于現在的大部分計算機都是通過二進制方式計算和存儲數據,所以我們生活中常用的十進制數據,要是想在保存在計算機中,就需要進行十進制和二進制的轉換。我們常見的整數可以很方便地進行十進制轉二進制,但是還有許多的實數,比如小數,是很難直接進行轉換的,所以就有了浮點數的概念。
浮點數進行精確計算
一般浮點數進行精確計算的方式就是,化整整除。比如:計算3.14*0.2,我們可以把它的每一個操作數都變成整數做乘法,之后再除去變大的倍數,即314*2/1000
在《Effective Java》這本書中就給出了一個解決方法。該書中也指出,float和double只能用來做科學計算或者是工程計算,在商業(yè)計算等精確計算中,我們要用java.math.BigDecimal。
例如:
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
System.out.println(b1.multiply(b2).doubleValue());