浮點數(shù)進行精確計算的問題

浮點數(shù)定義

在計算機科學中,浮點(英語:floating point,縮寫為FP)是一種對于實數(shù)的近似值數(shù)值表現(xiàn)法,由一個有效數(shù)字(即尾數(shù))加上冪數(shù)來表示,通常是乘以某個基數(shù)的整數(shù)次指數(shù)得到。以這種表示法表示的數(shù)值,稱為浮點數(shù)(floating-point number)。

浮點數(shù)表示方式

對浮點數(shù)的誤用

讓我們來看看下面這段代碼(這段代碼在jdk1.6中測試過

double PI = 3.14;
System.out.println(PI*10);

通常新手會錯誤的認為會輸出31.4,但是事實卻并不是這樣,這段代碼會輸出31.400000000000002。

為什么會出現(xiàn)這樣的輸出結(jié)果呢?

我們得從浮點數(shù)在計算機中的存儲結(jié)構(gòu)說起。

由于現(xiàn)在的大部分計算機都是通過二進制方式計算和存儲數(shù)據(jù),所以我們生活中常用的十進制數(shù)據(jù),要是想在保存在計算機中,就需要進行十進制和二進制的轉(zhuǎn)換。我們常見的整數(shù)可以很方便地進行十進制轉(zhuǎn)二進制,但是還有許多的實數(shù),比如小數(shù),是很難直接進行轉(zhuǎn)換的,所以就有了浮點數(shù)的概念。

浮點數(shù)進行精確計算

一般浮點數(shù)進行精確計算的方式就是,化整整除。比如:計算3.14*0.2,我們可以把它的每一個操作數(shù)都變成整數(shù)做乘法,之后再除去變大的倍數(shù),即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());

參考文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容