JAVA long类型转double精度缺失的问题怎么解决?

场景是这样,数据库存的是分单位的数字,比如1元数据库存100分。然后前端展示又是元单位的。所以取出来的时候就要把long类型的数字转成double。

出现0.88 - 0.05 = 0.83000000000....1 这种情况,怎么破?

阅读 13.7k
5 个回答

获取数据库存的数字后,使用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()方法用于格式化小数点
setScale(1)表示保留一位小数,默认用四舍五入方式
setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3
setScale(1,BigDecimal.ROUND_UP)进位处理,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)接近负无穷大的舍入,数字>0和ROUND_UP作用一样,数字<0和ROUND_DOWN作用一样
setScale(1,BigDecimal.ROUND_HALF_EVEN)向最接近的数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。

使用BigDecimal数据类型,代码如下:

public class MoneyUtil {

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

    /**
     * 分转元
     * @param fen 分
     * @return 元
     */
    public static String fenToYuan(String fen){
        // 第二个参数表示精度,就是保留小数点之后多少位;
        // 第三个参数表示精确方法,进位和舍位的标志位
        BigDecimal divide = new BigDecimal(fen).divide(ONE_HUNDRED, 2, 7);
        return divide.toString();
    }

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

所以你数据库中存String 类型的就可以了。

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

可以用Java的大数类型,比如BigDecimal
数据库中你可以存成decimal类型

钱一般都会用BigDecimal
实在不行转String截取一下。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题