Java-BigDecimal-解决double精度丢失问题

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

无限循环,导致精度丢失。

猜你喜欢

转载自blog.csdn.net/qq_29039853/article/details/88655817