1.在创建BigDecimal对象时,需要注意构造函数的使用。如果使用字符串或者字符数组、或者int整型等参数来创建BigDecimal对象,可以保证精度不会丢失;而如果使用浮点数或双精度数等参数创建BigDecimal对象,则可能会出现精度丢失的问题。因为部分浮点数计算本身就无法表示,所以在传入bigdecimal对象里的时候就已经丢失精度了。
例如:
public static void main(String[] args) {BigDecimal bigDecimal = new BigDecimal(8.8);System.out.println(bigDecimal);
}
输出结果:
8.800000000000000710542735760100185871124267578125
所以,在涉及到精度计算的过程中,我们尽量使用 String 类型来进行转换。
例如上面的代码替换为:
BigDecimal bigDecimal = new BigDecimal("8.8");
util工具类:
import java.math.BigDecimal;/*** @author liuhui* @date 2024/3/5 7:49 PM*/
public class BigDecimalUtils {public static BigDecimal doubleAdd(double v1, double v2) {BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.add(b2);}public static BigDecimal floatAdd(float v1, float v2) {BigDecimal b1 = new BigDecimal(Float.toString(v1));BigDecimal b2 = new BigDecimal(Float.toString(v2));return b1.add(b2);}public static BigDecimal doubleSub(double v1, double v2) {BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.subtract(b2);}public static BigDecimal floatSub(float v1, float v2) {BigDecimal b1 = new BigDecimal(Float.toString(v1));BigDecimal b2 = new BigDecimal(Float.toString(v2));return b1.subtract(b2);}public static BigDecimal doubleMul(double v1, double v2) {BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.multiply(b2);}public static BigDecimal floatMul(float v1, float v2) {BigDecimal b1 = new BigDecimal(Float.toString(v1));BigDecimal b2 = new BigDecimal(Float.toString(v2));return b1.multiply(b2);}public static BigDecimal doubleDiv(double v1, double v2) {BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));// 保留小数点后两位 ROUND_HALF_UP = 四舍五入return b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP);}public static BigDecimal floatDiv(float v1, float v2) {BigDecimal b1 = new BigDecimal(Float.toString(v1));BigDecimal b2 = new BigDecimal(Float.toString(v2));// 保留小数点后两位 ROUND_HALF_UP = 四舍五入return b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP);}/*** 比较v1 v2大小* @param v1* @param v2* @return v1>v2 return 1 v1=v2 return 0 v1<v2 return -1*/public static int doubleCompareTo(double v1, double v2) {BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.compareTo(b2);}public static int floatCompareTo(float v1, float v2) {BigDecimal b1 = new BigDecimal(Float.toString(v1));BigDecimal b2 = new BigDecimal(Float.toString(v2));return b1.compareTo(b2);}public static void main(String[] args) {BigDecimal bigDecimal = new BigDecimal("8.8");System.out.println(bigDecimal);BigDecimal d = doubleAdd(3.1012901, 2.101);System.out.println(d);}
}