<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    鷹翔宇空

    學(xué)習(xí)和生活

    BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
      110 Posts :: 141 Stories :: 315 Comments :: 1 Trackbacks

    這兩天,不斷的有人問我java中數(shù)值計(jì)算的精度問題,以前在項(xiàng)目中碰到過,吃了不少苦頭,但一直也沒管它,現(xiàn)在先小結(jié)一下,以后再慢慢補(bǔ)充吧,否則,過段時間又忘了。
         java
    中的基本類型float有著很嚴(yán)重的精度缺失問題,這個我主要是通過java.math.BigDecimal來彌補(bǔ),但BigDecimal畢竟是一個類,有著對象的創(chuàng)建銷毀等繁瑣的事情,況且java中類本身沒有destroy()方法,這就把一切對象的徹底銷毀后內(nèi)存的回收,變成了一個不可測的變數(shù),縱使你調(diào)用了system.gc(),但此方法的執(zhí)行時機(jī)卻又是未知的;所以這就要求程序員要盡可能少的創(chuàng)建對象(當(dāng)然這還與java本身的確非常消耗內(nèi)存有關(guān)),當(dāng)對象一旦不用,盡可能的置為null,否則當(dāng)程序運(yùn)行幾次后就會發(fā)現(xiàn)內(nèi)存占有率高居不下,甚至有導(dǎo)致死機(jī)可能。BigDecimal還有一點(diǎn)要引起注意的是,兩個對象即使值確實(shí)相等,但它們相比較時也可能會引起不等的結(jié)果,舉個例子如:

    BigDecimal testA = new BigDecimal(200)BigDecimal testB = new BigDecimal(200.00),也許你認(rèn)為testA.equals(testB)==true;但結(jié)果是false。然而testA.toString().equals(testB.toString())==true,這是因?yàn)?/SPAN>testB.toString()的值為200,在進(jìn)行類型轉(zhuǎn)換時,它已把小數(shù)點(diǎn)后的兩個零去掉了。為了解決這個問題,我通常的做法是將它們的小數(shù)點(diǎn)位數(shù)補(bǔ)起后再進(jìn)行比較,這樣是肯定不會出錯了,如testA = testA.setScale(2,5);testB = testB.setScale(2,5);當(dāng)然了你可以根據(jù)需要將小數(shù)點(diǎn)位數(shù)設(shè)多或設(shè)置少一點(diǎn),setScaleint,int)中第一位數(shù)為設(shè)置的小數(shù)點(diǎn)位數(shù),第二位是四舍五入的界值,你可以隨意修改,如6,就是大于等于6是就進(jìn)位。還有testA = testA.setScale(2,5)這種寫法在用BigDecimal時將會一直出現(xiàn),因?yàn)樗仨氁ㄟ^給自身返回值來替代已經(jīng)存在的值,如果你這樣寫testA.add(new BigDecimal(0)),那你會發(fā)現(xiàn)你的結(jié)果并不是想象中的200,而是0。當(dāng)然加減乘除都是一樣的。至于剛才的比較為何不用testA.floatValue(),當(dāng)然還是因?yàn)闀斐删葋G失的緣故了,當(dāng)然如果你的小數(shù)位數(shù)不超過5位的話,也是可以的,如果是超過5位,那就和第五位的值有關(guān)了(因?yàn)樗鼉H保留五位小數(shù)),顯示如果第五位大于等于五,即使第六位為零,也會在第五位上加一,否則后面的只會被截掉!
      說到這里,忽然想起javascript中的尾數(shù)和精度問題,javascript中有一個方法“toFixed(),這個方法就是用來截取小數(shù)點(diǎn)后尾數(shù)的長度的。例:var a = 343.12345465;var b = b.toFixed(4);這樣b小數(shù)點(diǎn)后的尾數(shù)就是4位了,注意,它是按照四舍五入進(jìn)行截取的。

    posted on 2005-12-17 15:30 TrampEagle 閱讀(10505) 評論(9)  編輯  收藏 所屬分類: 學(xué)習(xí)體會

    Feedback

    # re: java中數(shù)值計(jì)算的精度問題 2005-12-21 15:58 not_sub
    用 double 類型,一般就夠用了。 float 精度只有 6-7 位有效數(shù)字,當(dāng)然不夠。  回復(fù)  更多評論
      

    # re: java中數(shù)值計(jì)算的精度問題 2006-04-25 09:51 不同意樓上的
    double用來做計(jì)算非常的不準(zhǔn)確,加減之后都是接近值,但都不是精確值  回復(fù)  更多評論
      

    # re: java中數(shù)值計(jì)算的精度問題 2007-07-15 16:30 fon123
    在從數(shù)值上比較兩個 BigDecimal 值時,應(yīng)該使用 compareTo() 而不是 equals()   回復(fù)  更多評論
      

    # re: java中數(shù)值計(jì)算的精度問題 2007-08-23 15:07 不知道真的假的
    BigDecimal testAdd = new BigDecimal( 200 );
    testAdd.add( new BigDecimal( 0 ) );
    System.out.println( testAdd );

    這是照LZ的說法寫
    不幸的是,輸出是200
    是不是代碼寫錯?  回復(fù)  更多評論
      

    # re: java中數(shù)值計(jì)算的精度問題 2007-09-18 11:01 zhw
    可以用BigDecimal.valueOf()
    這樣不用new新對象的。  回復(fù)  更多評論
      

    # re: java中數(shù)值計(jì)算的精度問題 2007-10-17 20:17 T.WOLF
    @不知道真的假的
    200才是正確答案,我一直就是用add來完成加法操作的  回復(fù)  更多評論
      

    # re: java中數(shù)值計(jì)算的精度問題[未登錄] 2008-10-10 18:48 java菜鳥
    這個帖子的內(nèi)容不知道什么時候測試的,我用1.5測試和樓主所說有點(diǎn)不一致  回復(fù)  更多評論
      

    # re: java中數(shù)值計(jì)算的精度問題 2008-12-24 10:59 Meison
    BigDecimal.stripTrailingZeros().....  回復(fù)  更多評論
      

    # re: java中數(shù)值計(jì)算的精度問題 2011-09-05 21:05 sanga
    BigDecimal testAdd = new BigDecimal( 200 );
    testAdd.add( new BigDecimal( 1 ) );
    System.out.println( testAdd );
    我想LZ的意思是指輸出的結(jié)果依然為200吧
    值必須被指定到另一個變數(shù)才能保存結(jié)果  回復(fù)  更多評論
      

    主站蜘蛛池模板: 无码精品A∨在线观看免费| 亚洲免费视频在线观看| 毛片a级毛片免费观看品善网| 中文字幕亚洲免费无线观看日本| 亚洲精品A在线观看| 野花视频在线官网免费1| 国产免费一区二区三区VR| 亚洲欧美成人综合久久久| 免费高清资源黄网站在线观看 | 亚洲日韩av无码| 一个人免费观看www视频| 国产亚洲成人久久| 成在人线av无码免费高潮水| 日本zzzzwww大片免费| 午夜亚洲av永久无码精品| 亚洲精品免费在线| 一个人免费观看www视频在线 | 亚洲av成本人无码网站| 免费人成在线观看播放国产| 免费一级毛片在线播放视频免费观看永久| 色吊丝永久在线观看最新免费| 久久亚洲精品无码av| 久久99亚洲综合精品首页| 搡女人免费免费视频观看| 亚洲黄色片在线观看| 国产卡一卡二卡三免费入口| 亚洲丰满熟女一区二区哦| 亚洲国产综合人成综合网站| 免费一区二区无码东京热| 亚洲成a人片77777群色| 好吊妞788免费视频播放| xxxx日本在线播放免费不卡| 亚洲av无码国产精品色午夜字幕 | 国产成人免费AV在线播放| 亚洲精品美女在线观看| 国产高清视频在线免费观看| 国产精品视频全国免费观看| 亚洲毛片无码专区亚洲乱| 又色又污又黄无遮挡的免费视| 日本人成在线视频免费播放| 精品亚洲视频在线观看|