测试用例

import java.math.BigDecimal;

/**
* @author kegekeqi
* @version 1.0
* @date 2021-12-19 14:42
*/
public class basicReview {
public static void main(String[] args) {
Double f1 = 0.31;
Double f2 = 0.1;
System.out.println("=====没有做精度处理导致可能失去精度=======");
System.out.println(f1 + f2);
System.out.println(f1 * f2);
System.out.println(f1 / f2);
System.out.println(f1 - f2);
System.out.println("=======处理了之后=========");
BigDecimal b1 = new BigDecimal(String.valueOf(f1));
BigDecimal b2 = new BigDecimal(String.valueOf(f2));
System.out.println("b1:" + b1 + " b2:" + b2);
System.out.println(b1.add(b2));
System.out.println(b1.multiply(b2));
System.out.println(b1.divide(b2));
System.out.println(b1.subtract(b2));

}
}
"D:\Program Files\Java\jdk1.8.0_251\bin\java" -javaagent:D:\idea2017.2.5\ideaIU-2017.2.5.win\lib\idea_rt.jar=64564:D:\idea2017.2.5\ideaIU-2017.2.5.win\bin -Dfile.encoding=UTF-8 -classpath "D:\Program Files\Java\jdk1.8.0_251\jre\lib\charsets.jar;D:\Program Files\Java\jdk1.8.0_251\jre\lib\deploy.jar;D:\Program Files\Java\jdk1.8.0_251\jre\lib\ext\access-bridge-64.jar;D:\Program Files\Java\jdk1.8.0_251\jre\lib\ext\cldrdata.jar;D:\Program Files\Java\jdk1.8.0_251\jre\lib\ext\dnsns.jar;D:\Program Files\Java\jdk1.8.0_251\jre\lib\ext\jaccess.jar;D:\Program Files\Java\jdk1.8.0_251\jre\lib\ext\jfxrt.jar;D:\Program Files\Java\jdk1.8.0_251\jre\lib\ext\localedata.jar;D:\Program Files\Java\jdk1.8.0_251\jre\lib\ext\nashorn.jar;D:\Program Files\Java\jdk1.8.0_251\jre\lib\ext\sunec.jar;D:\Program Files\Java\jdk1.8.0_251\jre\lib\ext\sunjce_provider.jar;D:\Program Files\Java\jdk1.8.0_251\jre\lib\ext\sunmscapi.jar;D:\Program Files\Java\jdk1.8.0_251\jre\lib\ext\sunpkcs11.jar;D:\Program Files\Java\jdk1.8.0_251\jre\lib\ext\zipfs.jar;D:\Program Files\Java\jdk1.8.0_251\jre\lib\javaws.jar;D:\Program Files\Java\jdk1.8.0_251\jre\lib\jce.jar;D:\Program Files\Java\jdk1.8.0_251\jre\lib\jfr.jar;D:\Program Files\Java\jdk1.8.0_251\jre\lib\jfxswt.jar;D:\Program Files\Java\jdk1.8.0_251\jre\lib\jsse.jar;D:\Program Files\Java\jdk1.8.0_251\jre\lib\management-agent.jar;D:\Program Files\Java\jdk1.8.0_251\jre\lib\plugin.jar;D:\Program Files\Java\jdk1.8.0_251\jre\lib\resources.jar;D:\Program Files\Java\jdk1.8.0_251\jre\lib\rt.jar;D:\code\study\out\production\study" basicReview
=====没有做精度处理导致可能失去精度=======
0.41000000000000003
0.031
3.0999999999999996
0.21
=======处理了之后=========
b1:0.31 b2:0.1
0.41
0.031
3.1
0.21

Process finished with exit code 0

价格一般不用double,因为可能会丢失精度,一般用BigDecimal,返回String类型
item.setPayAmount(AmountUtils.changeFen2Yuan(Long.parseLong(item.getPayAmount())));

public static String changeFen2Yuan(long price) {
return BigDecimal.valueOf(price).divide(new BigDecimal(100)).toString();
}

如何用double,方便Excel求和,保留两位小数
double d = 111231.5585;
BigDecimal b = new BigDecimal(f);
double df = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();

2、构造器描述
BigDecimal(int) 创建一个具有参数所指定整数值的对象。
BigDecimal(double) 创建一个具有参数所指定双精度值的对象。 //不推荐使用
BigDecimal(long) 创建一个具有参数所指定长整数值的对象。
BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。//推荐使用

3、方法描述
add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象。
subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象。
divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象。
toString() 将BigDecimal对象的数值转换成字符串。
doubleValue() 将BigDecimal对象中的值以双精度数返回。
floatValue() 将BigDecimal对象中的值以单精度数返回。
longValue() 将BigDecimal对象中的值以长整数返回。
intValue() 将BigDecimal对象中的值以整数返回。