鍍金池/ 問答/Java/ JAVA long類型轉(zhuǎn)double精度缺失的問題怎么解決?

JAVA long類型轉(zhuǎn)double精度缺失的問題怎么解決?

場(chǎng)景是這樣,數(shù)據(jù)庫存的是分單位的數(shù)字,比如1元數(shù)據(jù)庫存100分。然后前端展示又是元單位的。所以取出來的時(shí)候就要把long類型的數(shù)字轉(zhuǎn)成double。

出現(xiàn)0.88 - 0.05 = 0.83000000000....1 這種情況,怎么破?

回答
編輯回答
淡墨

使用BigDecimal數(shù)據(jù)類型,代碼如下:

public class MoneyUtil {

    /**
     * Translates the String repre sentation of a BigDecimal into a BigDecimal.
     */
    private static final BigDecimal ONE_HUNDRED = new BigDecimal("100");

    /**
     * 分轉(zhuǎn)元
     * @param fen 分
     * @return 元
     */
    public static String fenToYuan(String fen){
        // 第二個(gè)參數(shù)表示精度,就是保留小數(shù)點(diǎn)之后多少位;
        // 第三個(gè)參數(shù)表示精確方法,進(jìn)位和舍位的標(biāo)志位
        BigDecimal divide = new BigDecimal(fen).divide(ONE_HUNDRED, 2, 7);
        return divide.toString();
    }

    /**
     * 元轉(zhuǎn)分
     * @param yuan 元
     * @return 分
     */
    public static String yuanToFen(String yuan){
        BigDecimal multiply = new BigDecimal(yuan).multiply(ONE_HUNDRED);
        return String.valueOf(multiply.intValue());
    }
}

所以你數(shù)據(jù)庫中存String 類型的就可以了。

2017年2月1日 20:39
編輯回答
小曖昧

可以先減再除啊。(88 - 5) / 100

2017年7月7日 17:53
編輯回答
傲嬌范

可以用Java的大數(shù)類型,比如BigDecimal
數(shù)據(jù)庫中你可以存成decimal類型

2018年2月5日 22:12
編輯回答
巷尾

獲取數(shù)據(jù)庫存的數(shù)字后,使用BigDecimal

        BigDecimal price1 = new BigDecimal(88 / 100.0);
        price1 = price1.setScale(2, BigDecimal.ROUND_HALF_DOWN);
        BigDecimal price2 = new BigDecimal(5 / 100.0);
        price2 = price2.setScale(2, BigDecimal.ROUND_HALF_DOWN);
        BigDecimal res = price1.subtract(price2);
        System.out.println(res);

clipboard.png

BigDecimal.setScale()方法用于格式化小數(shù)點(diǎn)
setScale(1)表示保留一位小數(shù),默認(rèn)用四舍五入方式
setScale(1,BigDecimal.ROUND_DOWN)直接刪除多余的小數(shù)位,如2.35會(huì)變成2.3
setScale(1,BigDecimal.ROUND_UP)進(jìn)位處理,2.35變成2.4
setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35變成2.4
setScale(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35變成2.3,如果是5則向下舍
setScale(1,BigDecimal.ROUND_CEILING)接近正無窮大的舍入
setScale(1,BigDecimal.ROUND_FLOOR)接近負(fù)無窮大的舍入,數(shù)字>0和ROUND_UP作用一樣,數(shù)字<0和ROUND_DOWN作用一樣
setScale(1,BigDecimal.ROUND_HALF_EVEN)向最接近的數(shù)字舍入,如果與兩個(gè)相鄰數(shù)字的距離相等,則向相鄰的偶數(shù)舍入。

2017年9月25日 02:52
編輯回答
凝雅

錢一般都會(huì)用BigDecimal
實(shí)在不行轉(zhuǎn)String截取一下。

2017年11月14日 04:39