package com.amarsoft.aims.util;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import com.amarsoft.are.lang.StringX;
import com.amarsoft.are.util.Arith;
/**
* 数学数字辅助处理类
* 该类来源于宁波项目组,原作者王慧
* 在宁波的基础上,根据安硕信贷系统开发编码规则对代码及注释进行了规范化处理
* @author syang
* @since 2013-12-27
*
*/
public class NumberAssistant {
/**
* 判断一个数字型变量是否是整数。如:double d1=3.00;此时,d1为整数
* @param originalSum 数字型变量
* @return
*/
public static boolean isNumeric(double originalSum){
Double numObj =new Double(originalSum);
return numObj.intValue()==originalSum;
}
/**
* 保留6位有效数字
* @param originalSum
* @return
*/
public static double keepSixDecimalFraction(double originalSum){
return Double.parseDouble(new DecimalFormat("0.000000").format(originalSum));
}
/**
* 保留7位有效数字
* @param originalSum 数字型变量
* @return
*/
public static double keepSevenDecimalFraction(double originalSum){
return Double.parseDouble(new DecimalFormat("0.0000000").format(originalSum));
}
/**
* 保留6位有效数字
* @param originalSum 数字型变量
* @param roud 是否在第七位是否四舍五入
* @return
*/
public static double keepSixDecimalFraction(double originalSum,boolean roud){
if(roud){
return keepSixDecimalFraction(originalSum);
}else{
return Double.parseDouble((new DecimalFormat("0.0000000").format(originalSum)).substring(0,8));
}
}
/**
* 保留2位有效数字
* @param originalSum 数字型变量
* @return
*/
public static double keepTwoDecimalFraction(double originalSum){
return Double.parseDouble(new DecimalFormat("0.00").format(originalSum));
}
/**
* 保留2位有效数字,三位一逗,不转换为科学计数法
* @param originalSum 数字型变量
* @return
*/
public static String keepTwoDecimalFormat(double originalSum){
DecimalFormat d = new DecimalFormat("###,##0.00");
return d.format(originalSum);
}
/**
* 加法运算
* @param d1
* @param d2
* @return
*/
public static double add(double d1, double d2) {
BigDecimal b1 = new BigDecimal(d1);
BigDecimal b2 = new BigDecimal(d2);
return b1.add(b2).doubleValue();
}
/**
* 减法运算
* @param d1
* @param d2
* @return
*/
public static double subtract(double d1, double d2) {
BigDecimal b1 = new BigDecimal(d1);
BigDecimal b2 = new BigDecimal(d2);
return b1.subtract(b2).doubleValue();
}
/**
* 乘法运算
* @param d1
* @param d2
* @return
*/
public static double multiply(double d1, double d2) {
BigDecimal b1 = new BigDecimal(d1);
BigDecimal b2 = new BigDecimal(d2);
return b1.multiply(b2).doubleValue();
}
/**
* 除法运算
* @param d1
* @param d2
* @return
*/
public static double divided(double d1, double d2) {
BigDecimal b1 = new BigDecimal(d1);
BigDecimal b2 = new BigDecimal(d2);
return b1.divide(b2, 10, BigDecimal.ROUND_HALF_DOWN).doubleValue();
}
/**
* 判断两个数字是否相等
* @param d1
* @param d2
* @return
*/
public static boolean equals(double d1,double d2){
return equals(d1,d2,0.01);
}
/**
* 判断两个数字是否相等
* @param d1
* @param d2
* @param scale
* @return
*/
public static boolean equals(double d1,double d2,double scale){
return NumberAssistant.subtract(d1, d2)<=scale;
}
/**
* 判断大于关系
* @param d1
* @param d2
* @return
*/
public static boolean moreThan(double d1, double d2){
return NumberAssistant.moreThan(d1, d2, 0.01);
}
/**
* 判断大于关系
* @param d1
* @param d2
* @param scale
* @return
*/
public static boolean moreThan(double d1, double d2, double scale){
if(NumberAssistant.equals(d1, d2, scale)){
return false;
}else{
return d1 > d2;
}
}
/**
* 金额单位型的转换,如果单位是万元则数据乘以一万,等等
* @param unitText 单位类型 %,万,亿等等
* @param valueType 1表示除(一般用在显示时处理),2表示乘(一般用在页面存入数据库时处理)
* @param value 需转换的数据
*/
public static double doubleValueConvert(String unitText,int valueType,double value){
double returnValue = value;
if(!StringX.isEmpty(unitText)){
if(unitText.indexOf("%")>=0){
if(valueType==2) returnValue = Arith.div(value, 100);
else if(valueType==1) returnValue = Arith.mul(value, 100);
}
if(unitText.indexOf("万")>=0){
if(valueType==1) returnValue = Arith.div(value, 10000);
else if(valueType==2) returnValue = Arith.mul(value, 10000);
}
if(unitText.indexOf("亿")>=0){
if(valueType==1) returnValue = Arith.div(value, 100000000);
else if(valueType==2) returnValue = Arith.mul(value, 100000000);
}
}
return returnValue;
}
}