Java:保留几位有效数字

96
linheimx
2016.10.13 10:54* 字数 486

来自

rounding to an arbitrary number of significant digits

例子:保留3位有效数字

  • 1,239,451 ===》 1,240,000
  • 12.1257 ===》12.1
  • .0681 ===》.0681
  • 5 ===》5

代码实现

public static double roundToSignificantFigures(double num, int n) {
    if(num == 0) {
        return 0;
    }

    final double d = Math.ceil(Math.log10(num < 0 ? -num: num));
    final int power = n - (int) d;

    final double magnitude = Math.pow(10, power);
    final long shifted = Math.round(num*magnitude);
    return shifted/magnitude;
}

原理分析

1. 基本数学知识

  1. Math.ceil()用作向上取整。
    math.ceil(8)=8
    math.ceil(8.5) =9
    math.ceil(-8) =-8
    math.ceil(-8.5))= -8

  2. Math.floor()用作向下取整。
    Math.floor(0.60) = 0
    Math.floor(0.40) = 0
    Math.floor(5) = 5
    Math.floor(5.1) = 5
    Math.floor(-5.1) = -6
    Math.floor(-5.9) = -6

  3. Math.round() 我们数学中常用到的四舍五入取整。
    math.round(-8.9) =-9
    math.round(-8.1) =-8
    math.round(8.9) =9
    math.round(8.1) =8

  4. Math.pow(底数,几次方)
    double a=2.0;
    double b=3.0;
    double c=Math.pow(a,b);
    就是2的三次方是多少;
    c最终为8;

  5. Math.log10(double a) 返回以10为底的double的值。
    特殊情况:
    如果参数是NaN或小于零,那么结果是NaN.
    如果参数是正无穷大,那么结果为正无穷大.
    如果参数是正零或负零,那么结果是负无穷大.
    如果参数是等于10N整数n,那么结果是n.

  6. 对数
    如果a的x次方等于N(a>0,且a不等于1),那么数X叫做以a为底N的对数(logarithm),记作x=logaN
    。其中,a叫做对数的底数,N叫做真数,x叫做“以a为N的对数”

2. 小技巧

对一个数,求其以10为底的对数,可以很方便的知道他的位数。
如:
Math.log10(60984.1)=4.78521661890635

60984.1的位数 5

原理

Math.round() 可以帮助我们四舍五入。注意它针对第一个小数点。
我们可以将12300变成1.23,这样就可以四舍五入了。然后还原位数10000.

Java