保留n位有效数字
程序员文章站
2022-05-18 16:54:57
...
灵感来自
rounding to an arbitrary number of significant digits
保留n位有效数字
原理1:对一个数,求其以10为底的对数,可以很方便的知道他的位数。
如:Math.log10(12345.6) = 4.091512201627772
然后向上取整Math.ceil(4.091512201627772) = 5
可以得知12345.6的位数是5
原理2:Math.round() 可以帮助我们四舍五入。注意它针对第一个小数点。
我们可以将 12345.6 乘以修正因子 0.01 变成 123.456 ,这样就可以四舍五入了。Math.round(123.456) = 123
最后除以修正因子0.01
/**
* 保留 n位有效数字
* @param num 需要保留的数字
* @param n 保留的有效数字位数
* @return Double
*/
public static Double roundToSignificantFigures(double num, int n) {
if (num == 0) {
return 0.0;
}
//获取num是几位数
double d = Math.ceil(Math.log10(num < 0 ? -num : num));
//获取修正因子
double magnitude = Math.pow(10, n - (int) d);
long shifted = Math.round(num * magnitude);
return shifted / magnitude;
}
上一篇: 实现页面刷新的三种方法
下一篇: 为什么数据库索引使用B+树实现
推荐阅读