欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

保留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;
    }
相关标签: 小知识