数字处理

/**   
 * @Title Arithmetic.java
 * @Package com.jinxinol.util
 * @Description: 精确的浮点四则运算,格式化
 * @author tuxy
 * @date Aug 20, 2012 8:29:40 PM
 * @version V1.0   
 */

package com.qxzl.util.string;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;

/**
 * 数字处理
 * 精确的浮点四则运算,格式化
 * 
 * @author tuxy
 * @time Aug 20, 2012 8:29:40 PM
 */
public class Arithmetic {
	// 默认除法运算精度
	private static final int DEF_DIV_SCALE = 3;

	// 这个类不能实例化
	private Arithmetic() {

	}

	/**
	 * 提供精确的加法运算。
	 * 
	 * @param v1
	 *            被加数
	 * @param v2
	 *            加数
	 * @return 两个参数的和
	 */

	public static double add(double v1, double v2) {
		BigDecimal b1 = new BigDecimal(Double.toString(v1));
		BigDecimal b2 = new BigDecimal(Double.toString(v2));
		return b1.add(b2).doubleValue();
	}

	/**
	 * 
	 * 提供精确的减法运算。
	 * 
	 * @param v1
	 *            被减数
	 * @param v2
	 *            减数
	 * @return 两个参数的差
	 */

	public static double sub(double v1, double v2) {
		BigDecimal b1 = new BigDecimal(Double.toString(v1));
		BigDecimal b2 = new BigDecimal(Double.toString(v2));
		return b1.subtract(b2).doubleValue();
	}

	/**
	 * 
	 * 提供精确的乘法运算。
	 * 
	 * @param v1
	 *            被乘数
	 * @param v2
	 *            乘数
	 * @return 两个参数的积
	 */

	public static double mul(double v1, double v2) {
		BigDecimal b1 = new BigDecimal(Double.toString(v1));
		BigDecimal b2 = new BigDecimal(Double.toString(v2));
		return b1.multiply(b2).doubleValue();
	}

	/**
	 * 
	 * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 小数点以后3位,以后的数字四舍五入。
	 * 
	 * @param v1
	 *            被除数
	 * @param v2
	 *            除数
	 * @return 两个参数的商
	 * 
	 */

	public static double div(double v1, double v2) {
		return div(v1, v2, DEF_DIV_SCALE);
	}

	/**
	 * 
	 * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指定精度,以后的数字四舍五入。
	 * 
	 * @param v1
	 *            被除数
	 * @param v2
	 *            除数
	 * @param scale
	 *            表示表示需要精确到小数点以后几位。
	 * @return 两个参数的商
	 */

	public static double div(double v1, double v2, int scale) {
		if (scale < 0) {
			throw 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).doubleValue();
	}

	/**
	 * 
	 * 提供精确的小数位四舍五入处理。
	 * 
	 * @param v
	 *            需要四舍五入的数字
	 * @param scale
	 *            小数点后保留几位
	 * @return 四舍五入后的结果
	 */

	public static double round(double v, int scale) {
		if (scale < 0) {
			throw new IllegalArgumentException("小数位数不能小于0");
		}
		BigDecimal b = new BigDecimal(Double.toString(v));
		BigDecimal one = new BigDecimal("1");
		return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}
	/**
	 * 
	 * 提供精确的小数位四舍五入处理。
	 * 
	 * @param v
	 *            需要四舍五入的数字
	 * @param scale
	 *            小数点后保留几位
	 * @return 四舍五入后的结果
	 */
	
	public static double round(double v) {
		BigDecimal b = new BigDecimal(Double.toString(v));
		BigDecimal one = new BigDecimal("1");
		return b.divide(one, DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue();
	}
	
	/**
	 * double 类型数据转换成String类型 避免科学技术法形式数据的出现
	 * 
	 * @param v1 需转换的double数据,
	 * @param scale 保留小数点后的位数
	 *            
	 * @return 返回double类型数据的字符串
	 */
	public static String number2str(Double v1, int scale){
		if(v1==null){
			return "0.00";
		}
		String format = "###.";
		for(int i=0; i<scale; i++){
			format += "#";
		}
		return format(format,v1);
	}
	
	/**
	 * double 类型数据转换成String类型 避免科学技术法形式数据的出现
	 * 
	 * @param v1 需转换的double数据,保留小数点后四位
	 *            
	 * @return 返回double类型数据的字符串
	 */
	public static String number2str(Double v1){
		if(v1==null){
			return "0.00";
		}
		return format("###.####",v1);
	}
	
	/**
	 * 数字格式化
	 * @param args
	 * @return String
	 */
	public static String format(Number number){
		return NumberFormat.getInstance(Locale.CHINA).format(number);
	}
	
	/**
	 * 自定义数字格式化
	 * @param args
	 * @return String
	 */
	public static String format(String format,Number number){
		return new DecimalFormat(format).format(number);
		
	}

	/**
	 * 数字格式化成财务数据格式
	 * @param args
	 * @return String
	 */
	public static String format2fin(Number number){
		return NumberFormat.getInstance(Locale.CHINA).format(number);
	}
	
	/**
	 * 格式化成百分数
	 * @param args
	 * @return String
	 */
	public static String formatPC(Number number){
		return NumberFormat.getPercentInstance(Locale.CHINA).format(number);
	}
	
	/**
	 *字符串型转换成数字 
	 *@param str
	 *@return Number
	 * @throws ParseException 
	 */
	public static Number parse(String str) throws ParseException {
		return NumberFormat.getNumberInstance().parse(str);
	}
	/**
	 * Float 类型数据转换成String类型 避免科学技术法形式数据的出现
	 * 
	 * @param number 需转换的Float数据,保留小数点后 count位
	 *            
	 * @return 返回Float类型数据的字符串
	 */
	public static String formatFloat(Float number,int count){
		if(number==null){
			return "0.0";
		}
		String format = "###.";
		for(int i=0; i<count; i++){
			format += "#";
		}
		return format(format,number);
	}
	
}

猜你喜欢

转载自my.oschina.net/openoschina/blog/1637702
今日推荐