一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java中使用BigDecimal進行浮點數運算

Java中使用BigDecimal進行浮點數運算

2019-11-24 15:29Java教程網 JAVA教程

這篇文章主要介紹了Java中使用BigDecimal進行浮點數運算,需要的朋友可以參考下

最近研究了一下Java的浮點數計算問題,從網上查詢了相關的資料,匯總并經過了一些整理和調試,最后完成此文,歡迎大家指出其中的錯誤和問題。
在Java中,float聲明的變量是單精度浮點數,double聲明的變量是雙精度浮點數,顧名思義就是double型的實體占用內存空間是float的兩倍。float是4個字節而double是8個字節。float和double類型的數據,無法精確表示計算結果,這是由于float和double是不精確的計算。大家可以通過下面代碼可以看出來:

復制代碼代碼如下:

public class Test
{
public static void main(String[] args)
{
System.out.println(0.05 + 0.01);
System.out.println(1.0 - 0.42);
System.out.println(4.015 * 100);
System.out.println(123.3 / 100);
}
}

 


運行的結果為:
0.060000000000000005
0.5800000000000001
401.49999999999994
1.2329999999999999

要想獲得理想的效果,我們可以嘗試使用java.text.DecimalFormat格式化浮點數:
DecimalFormat可以按照一定的格式格式化數字,常用的格式化字符是#、0等。例:

 

復制代碼代碼如下:

System.out.println(new java.text.DecimalFormat("0.00").format(3.125));
System.out.println(new java.text.DecimalFormat("0.00").format(3.135));

 


但是得到的結果是:
3.12
3.14

這是因為DecimalFormat是使用half-even 舍入(ROUND_HALF_EVEN),簡單的說就是向當四舍五入的5的時候向最近的偶數靠。所以使用DecimalForamt也無法得到可靠的浮點數。最后我們可以考慮使用BigDecimal來獲得更精確的計算:

BigDecimal提供了多個構造函數,和浮點數有關的有:

復制代碼代碼如下:

BigDecimal(double val)  Translates a double into a BigDecimal.
BigDecimal(String val)  Translates the String repre sentation of a BigDecimal into a BigDecimal.

 

但是用double參數來創建對象得到不精確的值,只有通過String來創建對象才是最準確的。

例如:

復制代碼代碼如下:

BigDecimal bd1=new BigDecimal(0.05);
System.out.println(bd1.toString());
BigDecimal bd2=new BigDecimal("0.05");
System.out.println(bd2.toString());

 

得到結果:

0.05000000000000000277555756156289135105907917022705078125
0.05

所以,我們最終需要使用String來創建對象,這樣得到的結果才是最精確的。另外,如果是double數,我們還可以使用:BigDecimal.valueOf(double val),原因很簡單,其JDK源碼如下所示:

復制代碼代碼如下:

public static BigDecimal valueOf(double val)
{
return new BigDecimal(Double.toString(val));
}

 

最后需要說明的是:BigDecimal的加減乘除其實最終都返回的是一個新的BigDecimal對象,因為BigDecimal是不可變的(immutable)的,在進行每一步運算時,都會產生一個新的對象,所以a.add(b);雖然做了加法操作,但是a并沒有保存加操作后的值,正確的用法應該是a=a.add(b)。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 美女扒开肌肌让男人桶 | 天天做天天爱天天一爽一毛片 | 精品国内自产拍在线视频 | 午夜精品在线视频 | 99国产高清久久久久久网站 | 欧美日韩亚洲第一区在线 | 波多 在线播放 | 成人免费体验区福利云点播 | 亚洲国产精品综合久久一线 | 日本五十路六十30人8时间 | 男人狂躁女人下半身 | 污黄漫 | 国产另类视频 | 青青草视频破解版 | 亚洲国产货青视觉盛宴 | 99av导航 | 1024在线视频精品免费 | 小sao货水好多真紧h的视频 | 人人澡 人人澡碰人人看软件 | 日本一区二区视频在线观看 | 99精品国产成人一区二区在线 | 久久综合老色鬼网站 | 国产在线伊人 | 精品久久久久久久久久久久久久久 | 污网站免费观看在线高清 | 果冻传媒 天美 麻豆 | 我的年轻漂亮继坶三级 | 精品无码乱码AV | 国产精品原创永久在线观看 | porono日本动漫 | 女子校生下媚药在线观看 | 色偷偷91久久综合噜噜噜 | 美女被躁了在线观看视频 | 国产中文在线视频 | 好大好硬抽搐好爽想要 | 无限在线看免费视频大全 | 亚洲aⅴ男人的天堂在线观看 | 好男人社区www影院在线观看 | 暖暖暖免费观看在线观看 | 韩国理论片最新第一页 | 精品久久久久久影院免费 |