来自
例子:保留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. 基本数学知识
-
Math.ceil()用作向上取整。
math.ceil(8)=8
math.ceil(8.5) =9
math.ceil(-8) =-8
math.ceil(-8.5))= -8 -
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 -
Math.round() 我们数学中常用到的四舍五入取整。
math.round(-8.9) =-9
math.round(-8.1) =-8
math.round(8.9) =9
math.round(8.1) =8 -
Math.pow(底数,几次方)
double a=2.0;
double b=3.0;
double c=Math.pow(a,b);
就是2的三次方是多少;
c最终为8; -
Math.log10(double a) 返回以10为底的double的值。
特殊情况:
如果参数是NaN或小于零,那么结果是NaN.
如果参数是正无穷大,那么结果为正无穷大.
如果参数是正零或负零,那么结果是负无穷大.
如果参数是等于10N整数n,那么结果是n.
2. 小技巧
对一个数,求其以10为底的对数,可以很方便的知道他的位数。
如:
Math.log10(60984.1)=4.78521661890635
60984.1的位数 5
原理
Math.round() 可以帮助我们四舍五入。注意它针对第一个小数点。
我们可以将12300变成1.23,这样就可以四舍五入了。然后还原位数10000.