Java中数字的有效位数,和小数点后保留的小数位

  • Post author:
  • Post category:java


import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
/**
 * JAVA中关于数字取几位有效位数,和小数点后保留几位小数的小示例。
 * @author SailingZhao
 *
 */
public class TestBigDecimal {
	
	/**保留几位有效数字
	 * @param oldDouble
	 * @param scale
	 * @return
	 */
	public static double significand(double oldDouble, int scale) {
		if (scale < 0) {
			throw new IllegalArgumentException(
					"scale指定的精度为非负值");
		}
		/**
		 * RoundingMode:舍入模式
		 * UP:远离零方向舍入的舍入模式;
		 * DOWN:向零方向舍入的舍入模式;
		 * CEILING: 向正无限大方向舍入的舍入模式;
		 * FLOOR:向负无限大方向舍入的舍入模式;
		 * HALF_DOWN:向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向下舍入;
		 * HALF_UP:向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向上舍入;
		 * HALF_EVEN:向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入;(在重复进行一系列计算时,此舍入模式可以将累加错误减到最小)
		 * UNNECESSARY:用于断言请求的操作具有精确结果的舍入模式,因此不需要舍入。
		 */
		RoundingMode rMode =null;
		//rMode=RoundingMode.FLOOR;
		//下面这种情况,其实和FLOOR一样的。
		if(oldDouble>0){
			rMode=RoundingMode.DOWN;
		}else{
			rMode=RoundingMode.UP;
		}
		//此处的scale表示的是,几位有效位数
		BigDecimal b = new BigDecimal(Double.toString(oldDouble),new MathContext(scale,rMode));
		return b.doubleValue();
	}
	/**小数点之后保留几位小数(此处,我们用BigDecimal提供的(除以div)方法实现)
	 * @param oldDouble
	 * @param scale
	 * @return
	 */
	public static double decimal(double oldDouble, int scale) {
		if (scale < 0) {
			throw new IllegalArgumentException(
					"The scale must be a positive integer or zero");
		}
		BigDecimal b = new BigDecimal(Double.toString(oldDouble));
		BigDecimal one = new BigDecimal("1");
		//return b.divide(one, scale, BigDecimal.ROUND_FLOOR).doubleValue();
		if(oldDouble>0){
			//此处的scale表示的是,小数点之后的精度。
			return b.divide(one, scale, BigDecimal.ROUND_DOWN).doubleValue();
		}else{
			return b.divide(one, scale, BigDecimal.ROUND_UP).doubleValue();
		}
	}
	public static void main(String[] args) {
		double d = 1.545;
		int scale = 2;
		double d1 = significand(d,scale);
		double d2 = decimal(d,scale);
		System.out.println(d+"保留"+scale+"位有效数字:"+d1);
		System.out.println(d+"保留小数点之后"+scale+"位小数:"+d2);
		
	}
}



版权声明:本文为yhzhaohy原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。