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

来源:互联网 发布:java hashmap stream 编辑:程序博客网 时间:2024/05/18 02:23
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);}}

0 0
原创粉丝点击