java中double类型1+1.82保留的很多小数如何处理

问题描述:

Java处理Double类型数据相加时,出现1+1.82=2.8200000000000003并存入数据库的情况

问题原因:

在计算机中,浮点数(如1.82)通常用二进制形式表示,而这种表示方式可能会导致精度丢失,因为不是所有的十进制小数都能精确地转换为二进制小数。当你在Java或Vue(实际上是在JavaScript环境中处理)中执行1 + 1.82这样的运算时,实际发生的计算可能类似于以下过程:


1、将1转换为浮点数格式,得到一个二进制表示。
2、将1.82转换为浮点数格式,同样得到一个二进制表示。这个转换过程中,1.82的二进制表示可能是一个无限循环的小数,因此会被截断或四舍五入到最接近的可表示值。
3、进行加法运算。


由于步骤2中的转换可能导致原始数值被稍微改变,所以即使你期望的结果是2.82,实际计算出的结果可能是2.8200000000000003,这是因为内部的浮点数表示和计算引入了微小的误差。

解决方法:

在Java中,如果你想将double类型的数值显示为小数点后保留两位的形式,你可以使用以下几种方法:


一、使用DecimalFormat类:

   double value = 2.8200000000000003;
   DecimalFormat df = new DecimalFormat("#.##");
   String formattedValue = df.format(value);
   System.out.println(formattedValue); // 输出 "2.82"
   

二、使用String.format方法:

   double value = 2.8200000000000003;
   String formattedValue = String.format("%.2f", value);
   System.out.println(formattedValue); // 输出 "2.82"
   

三、 使用NumberFormat类:

   double value =2.8200000000000003;
   NumberFormat nf = NumberFormat.getNumberInstance();
   nf.setMaximumFractionDigits(2);
   nf.setMinimumFractionDigits(2);
   nf.setGroupingUsed(false);
   String formattedValue = nf.format(value);
   System.out.println(formattedValue); // 输出 "2.82"
   

四、 使用BigDecimal类:

   double value = 2.8200000000000003;
   BigDecimal bd = new BigDecimal(Double.toString(value));
   bd = bd.setScale(2, RoundingMode.HALF_UP);
   double roundedValue = bd.doubleValue();
   System.out.println(roundedValue); // 输出 2.82
 /**
     * double转为两位小数
     * @param quantity
     * @return
     */
    public Double twoDouble(Double quantity){
        BigDecimal quantity1 = BigDecimal.valueOf(quantity);
        return quantity1.setScale(2, RoundingMode.HALF_UP).doubleValue();
    }

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值