问题描述:
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();}