欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中使用BigDecimal進行浮點數(shù)運算

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

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


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

要想獲得理想的效果,我們可以嘗試使用java.text.DecimalFormat格式化浮點數(shù):
DecimalFormat可以按照一定的格式格式化數(shù)字,常用的格式化字符是#、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));


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

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

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

復制代碼 代碼如下:

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ù)來創(chuàng)建對象得到不精確的值,只有通過String來創(chuàng)建對象才是最準確的。

例如:

復制代碼 代碼如下:

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來創(chuàng)建對象,這樣得到的結(jié)果才是最精確的。另外,如果是double數(shù),我們還可以使用:BigDecimal.valueOf(double val),原因很簡單,其JDK源碼如下所示:

復制代碼 代碼如下:

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

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

相關(guān)文章

  • Java設(shè)計模式之抽象工廠模式詳解

    Java設(shè)計模式之抽象工廠模式詳解

    這篇文章主要介紹了Java設(shè)計模式之抽象工廠模式詳解,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05
  • springboot+gradle 構(gòu)建多模塊項目的步驟

    springboot+gradle 構(gòu)建多模塊項目的步驟

    這篇文章主要介紹了springboot+gradle 構(gòu)建多模塊項目的步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Java Metrics系統(tǒng)性能監(jiān)控工具的使用詳解

    Java Metrics系統(tǒng)性能監(jiān)控工具的使用詳解

    Metrics是一個Java庫,可以對系統(tǒng)進行監(jiān)控,統(tǒng)計一些系統(tǒng)的性能指標。本文就來和大家詳細聊聊這個工具的具體使用,希望對大家有所幫助
    2022-11-11
  • 可視化定時任務quartz集成解析全過程

    可視化定時任務quartz集成解析全過程

    在開發(fā)中有很多定時任務都不是寫死的而是可以人為配置并且寫到數(shù)據(jù)庫中的,下面這篇文章主要給大家介紹了關(guān)于可視化定時任務quartz集成解析的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • java網(wǎng)絡(luò)編程之識別示例 獲取主機網(wǎng)絡(luò)接口列表

    java網(wǎng)絡(luò)編程之識別示例 獲取主機網(wǎng)絡(luò)接口列表

    一個客戶端想要發(fā)起一次通信,先決條件就是需要知道運行著服務器端程序的主機的IP地址是多少。然后我們才能夠通過這個地址向服務器發(fā)送信息。
    2014-01-01
  • Spring 中優(yōu)雅的獲取泛型信息的方法

    Spring 中優(yōu)雅的獲取泛型信息的方法

    這篇文章主要介紹了Spring 中優(yōu)雅的獲取泛型信息的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • J2ME編程中的幾個重要概念介紹

    J2ME編程中的幾個重要概念介紹

    本文介紹的是J2ME編程應用平臺中的幾個重要概念,希望對你有幫助,一起來看。
    2015-09-09
  • hibernate屬性級別注解實例代碼

    hibernate屬性級別注解實例代碼

    這篇文章主要介紹了hibernate屬性級別注解實例代碼,涉及屬性級別注釋添加方式及種類,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • Java設(shè)計模式之觀察者模式

    Java設(shè)計模式之觀察者模式

    這篇文章主要為大家介紹了Java觀察者模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • Java實現(xiàn)學生管理系統(tǒng)(IO版)

    Java實現(xiàn)學生管理系統(tǒng)(IO版)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)學生管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02

最新評論