BigDecimal的精确计算及工具类

 

System.out.println(new BigDecimal("10000000000").toString());
System.out.println( new BigDecimal("100.000").toString());
System.out.println( new BigDecimal("100.000").stripTrailingZeros().toString());
System.out.println( new BigDecimal("100.000").stripTrailingZeros().toPlainString());

输出:

10000000000
100.000
1E+2
100

 

BigDecimal是处理高精度的浮点数运算的常用的一个类
当需要将BigDecimal中保存的浮点数值打印出来,特别是在页面上显示的时候,就有可能遇到预想之外的科学技术法表示的问题。
一般直接使用 BigDecimal.toString()方法即可以完成浮点数的打印。如:
System.out.println( new BigDecimal("10000000000").toString());
但是,toString()方法输出的字符串并不能保证不是科学计数法。
不过在日常的使用中,用toString()方法输出的就是普通的数字字符串而非科学计数法。直接这么写:
System.out.println( new BigDecimal("100.000").toString());
程序的输出即为:  100.000
如果我们希望去除末尾多余的0,那么我们应该这么写:
System.out.println( new BigDecimal("100.000").stripTrailingZeros().toString());
其中,stripTrailingZeros()函数就是用于去除末尾多余的0的,但是此时程序的输出为: 1E+2
是科学计数法,可能并不是我们想要的。
解决的方法很简单,如果想要避免输出科学计数法的字符串,我们要用toPlainString()函数代替toString()。如:
System.out.println( new BigDecimal("100.000").stripTrailingZeros().toPlainString());
此时程序的输出就为 100


如果想要输出的是100.00 强制保留2位小数,则需要DecimalFormat。

System.out.println(new DecimalFormat("0.00").format(new BigDecimal("100.000")));

输出:

100.00

DecimalFormat中的“0” “#”意义:

Symbol    Location   Localized?  Meaning    
0              Number    Yes            Digit    
#             Number     Yes            Digit, zero shows as absent

简单说,0的没有的补零,#的没有就缺席没有(不显示)。

new java.text.DecimalFormat("#.###").format(3.0)  
new java.text.DecimalFormat("0.000").format(3.0)

输出的结果却为:  3 和 3.000 。

 

BigDecimalUtils工具类

package com.imddy.tweb.util;

import java.math.BigDecimal;
import java.text.DecimalFormat;

public class BigDecimalUtils {
	
	// 默认精度10, 应该是2,4, 特别是做金额计算,到分和到毫
	public static final int DEFAULT_SCALE = 10;
	public static final int DEFAULT_DIV_SCALE = 10;
	
	// 默认的格式化字符样式 “#。00”  还可以是像“#。0000”
	public static final String DEFAULT_FORMAT_STR = "#.00";
	
	// 加法
	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, DEFAULT_DIV_SCALE, BigDecimal.ROUND_HALF_UP);
	}
	
	// 对一个double截取指定的长度,利用除以1实现
	public static BigDecimal round(double v1, int scale) {
		if (scale < 0) {
			new IllegalArgumentException("The scale must be a positive integer or zero");
		}
		BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
        BigDecimal b2 = new BigDecimal("1");
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP);
	}

	// 除法,自定义精度
	public static BigDecimal div(double v1, double v2, int scale) {
		if (scale < 0) {
			new IllegalArgumentException("The scale must be a positive integer or zero");
		}
		BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP);
	}
	

	// 比较2个double值,相等返回0,大于返回1,小于返回-1
	public static int compareTo(double v1, double v2) {
		BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.compareTo(b2);
	}
	
	// 判断2个double的值相等这里要改,相等返回true,否则返回false
	public static boolean valuesEquals(double v1, double v2) {
		boolean result;
		BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        int resultInt = b1.compareTo(b2);
        if (resultInt == 0) {
        	result = true;
        } else {
        	result = false;
        }
        return result;
	}
	
	// 判断2个double的值,v1大于v2返回true,否则返回false
	public static boolean valuesGreater(double v1, double v2) {
		boolean result;
		BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        int resultInt = b1.compareTo(b2);
        if (resultInt > 0) {
        	result = true;
        } else {
        	result = false;
        }
        return result;
	}
	
	// 判断2个double的值,v1小于v2返回true,否则返回false
	public static boolean valuesLess(double v1, double v2) {
		boolean result;
		BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        int resultInt = b1.compareTo(b2);
        if (resultInt < 0) {
        	result = true;
        } else {
        	result = false;
        }
        return result;
	}
	
	// DecimalFormat格式化,使用默认的格式样式
	public static String format(Object object) {
		return new DecimalFormat(DEFAULT_FORMAT_STR).format(object);
	}
	
	// DecimalFormat格式化,使用传入的字符串格式样式
	public static String format(Object object, String formatStr) {
		return new DecimalFormat(formatStr).format(object);
	}

	
	
	
	public static void main(String[] args) {
		
		double a = 178.63;
		double b = 3.251;
		System.out.println(BigDecimalUtils.add(a, b));
		System.out.println(BigDecimalUtils.sub(a, b));
		System.out.println(BigDecimalUtils.mul(a, b));
		System.out.println(BigDecimalUtils.div(a, b));
		System.out.println(BigDecimalUtils.div(a, b, 5));
		// 不能以double来构建BigDecimal,只能由string来构建BigDecimal
		System.out.println(new BigDecimal(Double.valueOf(a)));
		System.out.println(new BigDecimal(Double.toString(a)));
		System.out.println(new BigDecimal(Double.toString(a)).toString());
		System.out.println(BigDecimalUtils.compareTo(a, b));
		System.out.println(BigDecimalUtils.compareTo(b, a));
		System.out.println(BigDecimalUtils.valuesEquals(0.002, 0.0020));
		System.out.println(BigDecimalUtils.valuesGreater(a, b));
		System.out.println(BigDecimalUtils.valuesLess(a, b));
		
		//
		System.out.println( BigDecimalUtils.mul(0.03, 0.0002).stripTrailingZeros().toPlainString() );
		System.out.println( BigDecimalUtils.mul(0.03, 0.0002).stripTrailingZeros() );
		System.out.println( BigDecimalUtils.mul(0.03, 0.0002).stripTrailingZeros().toString() );
		System.out.println("----------");
		
		System.out.println(new BigDecimal("10000000000").toString());
		System.out.println( new BigDecimal("100.000").toString());
		System.out.println( new BigDecimal("100.000").stripTrailingZeros().toString());
		System.out.println( new BigDecimal("100.000").stripTrailingZeros().toPlainString());
		
		System.out.println(new DecimalFormat("0.00").format(new BigDecimal("100.000")));
		System.out.println(new DecimalFormat("#.00").format(new BigDecimal("100.000")));

	}

}

 

转载于:https://my.oschina.net/lenglingx/blog/1618599

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值