package com.wangzerui.test;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import org.junit.Test;
public class BigDecimalTest {
/**
* double精度丢失问题处理******
* 精度丢失原因:double、float执行二进制浮点运算,执行小数时,有可能会出现无限不循环
* @throws Exception
*/
@Test
public void test01() throws Exception {
double d01 = 0.113333333333333;
double d02 = 0.34;
double d03 = 1;
BigDecimal bigDecimal01 = new BigDecimal(String.valueOf(d01));
BigDecimal bigDecimal02 = bigDecimal01.add(new BigDecimal(String.valueOf(d02)));
BigDecimal bigDecimal03 = bigDecimal02.add(new BigDecimal(String.valueOf(d03)));
System.out.println(bigDecimal03);
}
/**
* BigDecimal保留小数位
* @throws Exception
*/
@Test
public void test02() throws Exception {
BigDecimal bigDecimal = new BigDecimal(0);
BigDecimal chazhi = bigDecimal.subtract(new BigDecimal(1));
BigDecimal setScale = chazhi.setScale(2,BigDecimal.ROUND_HALF_DOWN);
System.out.println(setScale);
}
/**
* BigDecimal保留小数位
* @throws Exception
*/
@Test
public void test03() throws Exception {
DecimalFormat decimalFormat = new DecimalFormat("#0.00");
Number parse = decimalFormat.parse("0.11");
System.out.println(parse);
BigDecimal bigDecimal = new BigDecimal(0.11);
String str = decimalFormat.format(bigDecimal);
BigDecimal bigDecimal02 = new BigDecimal(str);
System.out.println(bigDecimal02);
}
/**
* BigDecimal compareTo方法:相等返回1,不等返回0
* @throws Exception
*/
@Test
public void test04() throws Exception {
BigDecimal bigDecimal = new BigDecimal(0);
System.out.println(bigDecimal.compareTo(new BigDecimal(0)));
}
}
分析Java double精度丢失的原因,是因为double和float运算采用的二进制浮点运算,执行小数时,有可能会出现无限不循环,导致精度丢失。
例如:
0.7=(0.1 0110 0110...)B
0.7*2=1.4========取出整数部分1
0.4*2=0.8========取出整数部分0
0.8*2=1.6========取出整数部分1
0.6*2=1.2========取出整数部分1
0.2*2=0.4========取出整数部分0
0.4*2=0.8========取出整数部分0
0.8*2=1.6========取出整数部分1
0.6*2=1.2========取出整数部分1
0.2*2=0.4========取出整数部分0
无限循环,导致精度丢失。