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