※ 引述《aliase (aliase)》之銘言:
: 為甚麼 ....
: System.out.println(""+(Double.parseDouble("4.34")*Double.parseDouble("230")));
: 是 998.19999999999 ??
: 天阿 ??
恩恩...感謝您問的問題 上google查了一下文章看到不錯的東西
http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=123&threadID=34521&tstart=240
我從這篇論壇的文章中擷取一些內容來說明
在《Effective Java》這本書中也提到這個原則
float和double只能用來做科學計算或者是工程計算
在商業計算中我們要用java.math.BigDecimal
BigDecimal 的建構子有四個 作者只說了兩個 分別是
BigDecimal(double val) 和 BigDecimal(String val)
在API文件說明中有提到兩者的差異 (我英文不好...不要叫我翻)
Note: the results of this constructor can be somewhat unpredictable. One
might assume that new BigDecimal(.1) is exactly equal to .1, but it is
actually equal to .1000000000000000055511151231257827021181583404541015625.
This is so because .1 cannot be represented exactly as a double (or, for that
matter, as a binary fraction of any finite length). Thus, the long value that
is being passed in to the constructor is not exactly equal to .1, appearances
notwithstanding.
The (String) constructor, on the other hand, is perfectly predictable: new
BigDecimal(".1") is exactly equal to .1, as one would expect. Therefore, it
is generally recommended that the (String) constructor be used in preference
to this one.
簡單說就是....以String當引數的建構子所回傳出來的數值比較能夠符合我們的預期
因此解決方案就是
如果我們要做一個加法運算,需要先將兩個浮點數轉為String,然後夠造出BigDecimal
在其中一個上使用四則運算方法(add,multiply等....),傳入另一個作為參數
然後把運算的結果(BigDecimal)再轉換為浮點數
最後
來個簡單的範例說明一下 (檔名 A.java)
import java.math.BigDecimal ;
public class A
{
public static void main(String args[])
{
BigDecimal num1 = new BigDecimal("4.34") ;
BigDecimal num2 = new BigDecimal("230") ;
num1 = num1.multiply(num2) ;
System.out.println(num1.doubleValue()) ;
}
}
算出來的數值就是 998.2 了
不過原理我不是很懂啦.... 講了老半天還是只說出實做而已 XD
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 163.25.118.131
※ 編輯: aeifkz 來自: 163.25.118.131 (12/05 17:51)