/**
* @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
今日推荐
周排行