真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

利用JAVA如何實(shí)現(xiàn)浮點(diǎn)數(shù)計(jì)算

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)利用JAVA如何實(shí)現(xiàn)浮點(diǎn)數(shù)計(jì)算,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

站在用戶的角度思考問題,與客戶深入溝通,找到遼中網(wǎng)站設(shè)計(jì)與遼中網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋遼中地區(qū)。

問題:

對(duì)兩個(gè)double類型的值進(jìn)行運(yùn)算,有時(shí)會(huì)出現(xiàn)結(jié)果值異常的問題。比如:

  System.out.println(19.99+20);
  System.out.println(1.0-0.66);
  System.out.println(0.033*100);
  System.out.println(12.3/100);

輸出:

39.989999999999995
0.33999999999999997
3.3000000000000003
0.12300000000000001

Java中的簡(jiǎn)單浮點(diǎn)數(shù)類型float和double不能夠精確運(yùn)算。這個(gè)問題其實(shí)不是JAVA的bug,因?yàn)橛?jì)算機(jī)本身是二進(jìn)制的,而浮點(diǎn)數(shù)實(shí)際上只是個(gè)近似值,所以從二進(jìn)制轉(zhuǎn)化為十進(jìn)制浮點(diǎn)數(shù)時(shí),精度容易丟失,導(dǎo)致精度下降。

關(guān)于精度損失的原理可以很簡(jiǎn)單的講,首先一個(gè)正整數(shù)在計(jì)算機(jī)中表示使用01010形式表示的,浮點(diǎn)數(shù)也不例外。

比如11,11除以2等于5余1

5除以2等于2余1

2除以2等于1余0

1除以2等于0余1

所以11二進(jìn)制表示為:1011.

double類型占8個(gè)字節(jié),64位,第1位為符號(hào)位,后面11位是指數(shù)部分,剩余部分是有效數(shù)字。

正整數(shù)除以2肯定會(huì)有個(gè)盡頭的,之后二進(jìn)制還原成十進(jìn)制只需要乘以2即可。

舉個(gè)例子:0.99用的有效數(shù)字部分,

0.99 * 2 = 1+0.98 --> 1
     0.98 * 2 = 1+0.96 --> 1
     0.96 * 2 = 1+0.92 -- >1
     0.92 * 2 = 1+0.84 -- >1
       ...............

這樣周而復(fù)始是沒法有盡頭的,而double有效數(shù)字有限,所以必定會(huì)有損失,所以二進(jìn)制無(wú)法準(zhǔn)確表示0.99,就像十進(jìn)制無(wú)法準(zhǔn)確表示1/3一樣。

解決辦法:

在《Effective Java》中提到一個(gè)原則,那就是float和double只能用來(lái)作科學(xué)計(jì)算或者是工程計(jì)算,但在商業(yè)計(jì)算中我們要用java.math.BigDecimal,通過使用BigDecimal類可以解決上述問題,首先需要注意的是,直接使用字符串來(lái)構(gòu)造BigDecimal是絕對(duì)沒有精度損失的,如果用double或者把double轉(zhuǎn)化成string來(lái)構(gòu)造BigDecimal依然會(huì)有精度損失,所以我覺得這種解決方法就是在使用中就把浮點(diǎn)數(shù)用string來(lái)表示存放,涉及到運(yùn)算直接用string構(gòu)造double,否則肯定會(huì)有精度損失。

1. 相加

/**
 * 相加
 * @param double1
 * @param double2
 * @return
 */
public static double add(String doubleValA, String doubleValB) { 
  BigDecimal a2 = new BigDecimal(doubleValA); 
  BigDecimal b2 = new BigDecimal(doubleValB); 
  return a2.add(b2).doubleValue(); 
}

2. 相減

/**
 * 相減
 * @param double1
 * @param double2
 * @return
 */
public static double sub(String doubleValA, String doubleValB) { 
  BigDecimal a2 = new BigDecimal(doubleValA); 
  BigDecimal b2 = new BigDecimal(doubleValB); 
  return a2.subtract(b2).doubleValue();
}

3. 相乘

/**
 * 相乘
 * @param double1
 * @param double2
 * @return
 */
public static double mul(String doubleValA, String doubleValB) { 
  BigDecimal a2 = new BigDecimal(doubleValA); 
  BigDecimal b2 = new BigDecimal(doubleValB); 
  return a2.multiply(b2).doubleValue();
}

4. 相除

/**
 * 相除
 * @param double1
 * @param double2
 * @param scale 除不盡時(shí)指定精度
 * @return
 */
public static double div(String doubleValA, String doubleValB, int scale) { 
  BigDecimal a2 = new BigDecimal(doubleValA); 
  BigDecimal b2 = new BigDecimal(doubleValB);
  return a2.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); 
}

5. 主函數(shù)調(diào)用

public static void main(String[] args) {
  String doubleValA = "3.14159267";
  String doubleValB = "2.358";
  System.out.println("add:" + add(doubleValA, doubleValB));
  System.out.println("sub:" + sub(doubleValA, doubleValB));
  System.out.println("mul:" + mul(doubleValA, doubleValB));
  System.out.println("div:" + div(doubleValA, doubleValB, 8));
}

結(jié)果展示如下所示:

 add:5.49959267
 sub:0.78359267
 mul:7.40787551586
 div:1.33231241

所以最好的方法是完全拋棄double,用string和java.math.BigDecimal。

java遵照IEEE制定的浮點(diǎn)數(shù)表示法來(lái)進(jìn)行float,double運(yùn)算。這種結(jié)構(gòu)是一種科學(xué)計(jì)數(shù)法,用符號(hào)、指數(shù)和尾數(shù)來(lái)表示,底數(shù)定為2——即把一個(gè)浮點(diǎn)數(shù)表示為尾數(shù)乘以2的指數(shù)次方再添上符號(hào)。具體底層如何存儲(chǔ)以及如何進(jìn)行運(yùn)行請(qǐng)繼續(xù)關(guān)注我的博客,后續(xù)我會(huì)將詳情總結(jié)好的。

上述就是小編為大家分享的利用JAVA如何實(shí)現(xiàn)浮點(diǎn)數(shù)計(jì)算了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


文章名稱:利用JAVA如何實(shí)現(xiàn)浮點(diǎn)數(shù)計(jì)算
網(wǎng)站URL:http://weahome.cn/article/jeghjs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部