0
点赞
收藏
分享

微信扫一扫

JavaWeb - Util 之 BigDecimalUtil(解决浮点型商业运算中丢失精度的问题)


JavaWeb - Util 之 BigDecimalUtil(解决浮点型商业运算中丢失精度的问题)_解决浮点型商业运算中丢失精度的问题

测试代码

package com.mmall.test;

import org.junit.Test;
import java.math.BigDecimal;

public class BigDecimalTest {

@Test
public void test1(){
System.out.println(0.05+0.01);
System.out.println(1.0-0.42);
System.out.println(4.015*100);
System.out.println(123.3/100);
}

/*
0.060000000000000005
0.5800000000000001
401.49999999999994
1.2329999999999999
*/

@Test
public void test2(){
BigDecimal b1 = new BigDecimal(0.05);
BigDecimal b2 = new BigDecimal(0.01);
System.out.println(b1.add(b2));
}

/*
0.06000000000000000298372437868010820238851010799407958984375
*/

@Test
public void test3(){
BigDecimal b1 = new BigDecimal("0.05");
BigDecimal b2 = new BigDecimal("0.01");
System.out.println(b1.add(b2));
}

/*
0.6
*/

}

Ps:综上所述,得出结论,必须把计算的浮点数转成String类型进行构造BigDecimal函数才能精确计算。


工具类

package com.mmall.util;

import java.math.BigDecimal;

public class BigDecimalUtil {

private BigDecimalUtil(){
}

public static BigDecimal add(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 sub(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 mul(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 div(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.divide(b2,2,BigDecimal.ROUND_HALF_UP);//四舍五入,保留2位小数
//除不尽的情况
}
}



举报

相关推荐

Java解决浮点精度问题

解决Long丢失精度问题

0 条评论