來自
rounding to an arbitrary number of significant digits
例子:保留3位有效數(shù)字
- 1,239,451 ===》 1,240,000
- 12.1257 ===》12.1
- .0681 ===》.0681
- 5 ===》5
代碼實現(xiàn)
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. 基本數(shù)學(xué)知識
Math.ceil()用作向上取整。
math.ceil(8)=8
math.ceil(8.5) =9
math.ceil(-8) =-8
math.ceil(-8.5))= -8Math.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) = -6Math.round() 我們數(shù)學(xué)中常用到的四舍五入取整。
math.round(-8.9) =-9
math.round(-8.1) =-8
math.round(8.9) =9
math.round(8.1) =8Math.pow(底數(shù),幾次方)
double a=2.0;
double b=3.0;
double c=Math.pow(a,b);
就是2的三次方是多少;
c最終為8;Math.log10(double a) 返回以10為底的double的值。
特殊情況:
如果參數(shù)是NaN或小于零,那么結(jié)果是NaN.
如果參數(shù)是正無窮大,那么結(jié)果為正無窮大.
如果參數(shù)是正零或負(fù)零,那么結(jié)果是負(fù)無窮大.
如果參數(shù)是等于10N整數(shù)n,那么結(jié)果是n.對數(shù)
如果a的x次方等于N(a>0,且a不等于1),那么數(shù)X叫做以a為底N的對數(shù)(logarithm),記作x=logaN
。其中,a叫做對數(shù)的底數(shù),N叫做真數(shù),x叫做“以a為底N的對數(shù)”
2. 小技巧
對一個數(shù),求其以10為底的對數(shù),可以很方便的知道他的位數(shù)。
如:
Math.log10(60984.1)=4.78521661890635
60984.1的位數(shù) 5
原理
Math.round() 可以幫助我們四舍五入。注意它針對第一個小數(shù)點。
我們可以將12300變成1.23,這樣就可以四舍五入了。然后還原位數(shù)10000.
