最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中使用BigDecimal進(jìn)行浮點(diǎn)數(shù)運(yùn)算

 更新時(shí)間:2014年07月05日 14:20:39   投稿:junjie  
這篇文章主要介紹了Java中使用BigDecimal進(jìn)行浮點(diǎn)數(shù)運(yùn)算,需要的朋友可以參考下

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

復(fù)制代碼 代碼如下:

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);
}
}


運(yùn)行的結(jié)果為:
0.060000000000000005
0.5800000000000001
401.49999999999994
1.2329999999999999

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

復(fù)制代碼 代碼如下:

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


但是得到的結(jié)果是:
3.12
3.14

這是因?yàn)镈ecimalFormat是使用half-even 舍入(ROUND_HALF_EVEN),簡(jiǎn)單的說(shuō)就是向當(dāng)四舍五入的5的時(shí)候向最近的偶數(shù)靠。所以使用DecimalForamt也無(wú)法得到可靠的浮點(diǎn)數(shù)。最后我們可以考慮使用BigDecimal來(lái)獲得更精確的計(jì)算:

BigDecimal提供了多個(gè)構(gòu)造函數(shù),和浮點(diǎn)數(shù)有關(guān)的有:

復(fù)制代碼 代碼如下:

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

但是用double參數(shù)來(lái)創(chuàng)建對(duì)象得到不精確的值,只有通過(guò)String來(lái)創(chuàng)建對(duì)象才是最準(zhǔn)確的。

例如:

復(fù)制代碼 代碼如下:

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

得到結(jié)果:

0.05000000000000000277555756156289135105907917022705078125
0.05

所以,我們最終需要使用String來(lái)創(chuàng)建對(duì)象,這樣得到的結(jié)果才是最精確的。另外,如果是double數(shù),我們還可以使用:BigDecimal.valueOf(double val),原因很簡(jiǎn)單,其JDK源碼如下所示:

復(fù)制代碼 代碼如下:

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

最后需要說(shuō)明的是:BigDecimal的加減乘除其實(shí)最終都返回的是一個(gè)新的BigDecimal對(duì)象,因?yàn)锽igDecimal是不可變的(immutable)的,在進(jìn)行每一步運(yùn)算時(shí),都會(huì)產(chǎn)生一個(gè)新的對(duì)象,所以a.add(b);雖然做了加法操作,但是a并沒(méi)有保存加操作后的值,正確的用法應(yīng)該是a=a.add(b)。

相關(guān)文章

  • 關(guān)于SSM框架下各層的解釋說(shuō)明(Controller等)

    關(guān)于SSM框架下各層的解釋說(shuō)明(Controller等)

    這篇文章主要介紹了關(guān)于SSM框架下各層的解釋說(shuō)明(Controller等),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • idea指定maven的settings文件不生效的問(wèn)題解決

    idea指定maven的settings文件不生效的問(wèn)題解決

    本文主要介紹了idea指定maven的settings文件不生效的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 基于SpringMVC對(duì)接前端參數(shù)注解

    基于SpringMVC對(duì)接前端參數(shù)注解

    這篇文章主要介紹了基于SpringMVC對(duì)接前端參數(shù)注解的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 解析Java繼承中方法的覆蓋和重載

    解析Java繼承中方法的覆蓋和重載

    這篇文章主要介紹了Java繼承中方法的覆蓋和重載的詳細(xì)概念及用法,非常的實(shí)用,這里推薦給大家,有需要的小伙伴可以參考下。
    2015-05-05
  • IDEA2023版本創(chuàng)建Spring項(xiàng)目只能勾選17和21卻無(wú)法使用Java8的完美解決方案

    IDEA2023版本創(chuàng)建Spring項(xiàng)目只能勾選17和21卻無(wú)法使用Java8的完美解決方案

    想創(chuàng)建一個(gè)springboot的項(xiàng)目,本地安裝的是1.8,但是在使用Spring Initializr創(chuàng)建項(xiàng)目時(shí),發(fā)現(xiàn)版本只有17和21,這篇文章主要介紹了IDEA2023版本創(chuàng)建Sping項(xiàng)目只能勾選17和21,卻無(wú)法使用Java8的解決方法,需要的朋友可以參考下
    2023-12-12
  • Java BigDecimal解決double精度丟失的問(wèn)題

    Java BigDecimal解決double精度丟失的問(wèn)題

    我們?cè)谌粘i_(kāi)發(fā)中, 有很多時(shí)候會(huì)遇到小數(shù)(double類型)精確計(jì)算,本文主要介紹了Java BigDecimal解決double精度丟失的問(wèn)題,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • 通過(guò)圖例了解IDEA引入JQuery實(shí)現(xiàn)步驟

    通過(guò)圖例了解IDEA引入JQuery實(shí)現(xiàn)步驟

    這篇文章主要介紹了IDEA引入JQuery實(shí)現(xiàn)步驟圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • java實(shí)現(xiàn)Redisson看門(mén)狗機(jī)制

    java實(shí)現(xiàn)Redisson看門(mén)狗機(jī)制

    redission看門(mén)狗機(jī)制是解決分布式鎖的續(xù)約問(wèn)題,本文就來(lái)詳細(xì)的介紹一下java實(shí)現(xiàn)Redisson看門(mén)狗機(jī)制,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-09-09
  • Java中連接Mongodb進(jìn)行增刪改查的操作詳解

    Java中連接Mongodb進(jìn)行增刪改查的操作詳解

    MongoDB是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù),由C++語(yǔ)言編寫(xiě),旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案,本文給大家介紹了Java中連接Mongodb進(jìn)行操作,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2024-06-06
  • spring boot 不連接數(shù)據(jù)庫(kù)啟動(dòng)的解決

    spring boot 不連接數(shù)據(jù)庫(kù)啟動(dòng)的解決

    這篇文章主要介紹了spring boot 不連接數(shù)據(jù)庫(kù)啟動(dòng)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08

最新評(píng)論

奉化市| 将乐县| 手游| 三门县| 洞口县| 比如县| 涟水县| 怀安县| 扶风县| 云阳县| 沐川县| 禹城市| 高州市| 白玉县| 商城县| 陆川县| 伊春市| 游戏| 贵港市| 衢州市| 南投市| 武清区| 通州区| 桃源县| 芮城县| 榕江县| 阳高县| 乾安县| 黄陵县| 广州市| 历史| 乐清市| 大宁县| 湘阴县| 贵港市| 平远县| 大埔县| 武夷山市| 阳原县| 偃师市| 合水县|