關(guān)于Java中double類型的運(yùn)算精度問(wèn)題

Java中Double保留后小數(shù)位的幾種方法

返回double型的

1.能四舍五入

double d = 114.145; 
d = (double) Math.round(d * 100) / 100;
System.out.println(d) 
  1. BigDecimal.ROUND_HALF_UP表示四舍五入秽晚,BigDecimal.ROUND_HALF_DOWN也是五舍六入荞下,BigDecimal.ROUND_UP表示進(jìn)位處理(就是直接加1),BigDecimal.ROUND_DOWN表示直接去掉尾數(shù)乘陪。
double d = 114.145;
BigDecimal b = new BigDecimal(d);
d = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
System.out.println(d);

返回String型的

1.#.00表示保留后兩位,它的處理方式是直接截掉不要的尾數(shù),不四舍五入泽铛。

double d = 114.145;
DecimalFormat df = new DecimalFormat("#.00");
String str = df.format(d);
System.out.println(str);

2.%.2f表示保留后兩位,能四舍五入辑鲤。

double d = 114.145;
String.format("%.2f", d);

3.RoundingMode.HALF_DOWN表示 五舍六入盔腔,負(fù)數(shù)先取絕對(duì)值再五舍六入再負(fù)數(shù),RoundingMode.HALF_UP:表示四舍五入月褥,負(fù)數(shù)先取絕對(duì)值再五舍六入再負(fù)數(shù)弛随。

double d = 114.145
NumberFormat nf = NumberFormat.getNumberInstance();  // 保留兩位小數(shù)
nf.setMaximumFractionDigits(2);  // 如果不需要四舍五入,可以使用RoundingMode.DOWN
nf.setRoundingMode(RoundingMode.UP); 
System.out.println(nf.format(d));

Java中double類型的運(yùn)算

BigDecimal
在《Effective Java》這本書(shū)中也提到這個(gè)原則宁赤,float和double只能用來(lái)做科學(xué)計(jì)算或者是工程計(jì)算舀透,在商業(yè)計(jì)算中我們要用 java.math.BigDecimal。原則是使用BigDecimal并且一定要用String來(lái)夠造决左。

import java.math.BigDecimal;
/**
 * 由于Java的簡(jiǎn)單類型不能夠精確的對(duì)浮點(diǎn)數(shù)進(jìn)行運(yùn)算愕够,這個(gè)工具類提供精
 * 確的浮點(diǎn)數(shù)運(yùn)算走贪,包括加減乘除和四舍五入。
 */
public class Arith{
    //默認(rèn)除法運(yùn)算精度
    private static final int DEF_DIV_SCALE = 10;
    //這個(gè)類不能實(shí)例化
    private Arith(){
    }
 
    /**
     * 提供精確的加法運(yùn)算惑芭。
     * @param v1 被加數(shù)
     * @param v2 加數(shù)
     * @return 兩個(gè)參數(shù)的和
     */
    public static double add(double v1,double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.add(b2).doubleValue();
    }
    /**
     * 提供精確的減法運(yùn)算坠狡。
     * @param v1 被減數(shù)
     * @param v2 減數(shù)
     * @return 兩個(gè)參數(shù)的差
     */
    public static double sub(double v1,double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.subtract(b2).doubleValue();
    } 
    /**
     * 提供精確的乘法運(yùn)算。
     * @param v1 被乘數(shù)
     * @param v2 乘數(shù)
     * @return 兩個(gè)參數(shù)的積
     */
    public static double mul(double v1,double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.multiply(b2).doubleValue();
    }
 
    /**
     * 提供(相對(duì))精確的除法運(yùn)算遂跟,當(dāng)發(fā)生除不盡的情況時(shí)逃沿,精確到
     * 小數(shù)點(diǎn)以后10位,以后的數(shù)字四舍五入幻锁。
     * @param v1 被除數(shù)
     * @param v2 除數(shù)
     * @return 兩個(gè)參數(shù)的商
     */
    public static double div(double v1,double v2){
        return div(v1,v2,DEF_DIV_SCALE);
    }
 
    /**
     * 提供(相對(duì))精確的除法運(yùn)算凯亮。當(dāng)發(fā)生除不盡的情況時(shí)螃壤,由scale參數(shù)指
     * 定精度腹殿,以后的數(shù)字四舍五入岭洲。
     * @param v1 被除數(shù)
     * @param v2 除數(shù)
     * @param scale 表示表示需要精確到小數(shù)點(diǎn)以后幾位享怀。
     * @return 兩個(gè)參數(shù)的商
     */
    public static double div(double v1,double v2,int scale){
        if(scale<0){
            throw new IllegalArgumentException(
                "The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
 
    /**
     * 提供精確的小數(shù)位四舍五入處理猫胁。
     * @param v 需要四舍五入的數(shù)字
     * @param scale 小數(shù)點(diǎn)后保留幾位
     * @return 四舍五入后的結(jié)果
     */
    public static double round(double v,int scale){
        if(scale<0){
            throw new IllegalArgumentException(
                "The scale must be a positive integer or zero");
        }
        BigDecimal b = new BigDecimal(Double.toString(v));
        BigDecimal one = new BigDecimal("1");
        return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末末患,一起剝皮案震驚了整個(gè)濱河市伏恐,隨后出現(xiàn)的幾起案子咙咽,更是在濱河造成了極大的恐慌亿傅,老刑警劉巖媒峡,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異葵擎,居然都是意外死亡谅阿,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門(mén)酬滤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)签餐,“玉大人,你說(shuō)我怎么就攤上這事盯串÷乳埽” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵体捏,是天一觀的道長(zhǎng)冠摄。 經(jīng)常有香客問(wèn)我,道長(zhǎng)几缭,這世上最難降的妖魔是什么河泳? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮年栓,結(jié)果婚禮上拆挥,老公的妹妹穿的比我還像新娘。我一直安慰自己某抓,他們只是感情好纸兔,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布黄锤。 她就那樣靜靜地躺著,像睡著了一般食拜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上副编,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天负甸,我揣著相機(jī)與錄音,去河邊找鬼痹届。 笑死呻待,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的队腐。 我是一名探鬼主播蚕捉,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼柴淘!你這毒婦竟也來(lái)了迫淹?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤为严,失蹤者是張志新(化名)和其女友劉穎敛熬,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體第股,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡应民,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了夕吻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诲锹。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖涉馅,靈堂內(nèi)的尸體忽然破棺而出归园,到底是詐尸還是另有隱情,我是刑警寧澤稚矿,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布蔓倍,位于F島的核電站,受9級(jí)特大地震影響盐捷,放射性物質(zhì)發(fā)生泄漏偶翅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一碉渡、第九天 我趴在偏房一處隱蔽的房頂上張望聚谁。 院中可真熱鬧,春花似錦滞诺、人聲如沸形导。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)朵耕。三九已至炫隶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間阎曹,已是汗流浹背伪阶。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留处嫌,地道東北人栅贴。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像熏迹,于是被迫代替她去往敵國(guó)和親檐薯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容