由于java.math.BigDecimal提供的方法只可以进行工程计算,无法进行精确的商业计算,所以当需要求得精确的数值的时候。这个类就不行了。
java.math.BigDecimal提供的round()方法进行四舍五入的时候,其结果也不是让我们满意的。
我们可以按照下面的方法设计一个类,进行精确的数值计算。下面的:
package hagar;
import java.util.*;
import java.math.BigDecimal;
class Arith
{
private static final int DEF_DIV_SCALE=10;
private Arith()
{
}
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();
}
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();
}
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();
}
public static double div(double v1,double v2)//这个函数的一个好处是当除不尽的时候,有scale参数指定精度,以后的数字四舍五入。
{
BigDecimal b1=new BigDecimal(Double.toString(v1));
BigDecimal b2=new BigDecimal(Double.toString(v2));
return b1.divide(b2,DEF_DIV_SCALE,BigDecimal.ROUND_HALF_UP).doubleValue();
}
public static double round(double v,int scale)
{
if(scale<0)
{
throw new IllegalArgumentException("the scale must be a positive or zero");
}
BigDecimal b1=new BigDecimal(Double.toString(v));
BigDecimal one=new BigDecimal("1");
return b1.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
}
public class s2 {
public static void main(String[]args)
{
System.out.println(Math.round(12.116));//java.math.BigDecimal类的round方法结果输出12,本来该是12.12
System.out.println(new java.text.DecimalFormat("0.00").format(4.025));/*java.text.DecimalFormat类也是不可以的。输出4.02本来该是4.03的*/
System.out.println(Arith.mul(12.3455, 1));
System.out.println(Arith.div(10,3));
System.out.println(Arith.round(12.115, 2));
System.out.println(Arith.add(12.34, 23.45));
System.out.println(Arith.sub(12.05, 1.2));
}
}
本文出自 “hagar” 博客,谢绝转载!