Java實現開根號運算(不使用數組和String)


使用Java自己實現開根號運算,網上也有不少代碼,多數都使用String或者數組。這里寫一段只使用double基礎數據類型實現的方法。

    private static double sqrt(int n, int p) {
        double lower = 0;
        while (lower * lower < n) {
            lower++;
        }
        --lower;

        int flag = 1;
        int d = 10;
        while (flag <= p + 1) {
            d = 10;
            for (int x = 1; x < flag; x++) {
                d = d * 10;
            }
            double step = 1.d / d;
            for (int i = 0; i < 10; i++) {
                if (lower * lower > n) {
                    break;
                }
                lower = lower + step;
            }
            lower = lower - step;

            flag++;
        }

        double v1 = lower * (d * 10);
        int v = ((int) v1 % 100) / 10;
        double res;
        if (v < 5) {
            res = (lower * d - v) / d;
        } else {
            res = (lower * d - v + 10) / d;
        }
        return res;
    }

參數中n是整數,p是精度。這種程序一般不能支持特別高的精度(比如幾十位),五六位就不錯了。

代碼原理簡單,這里就不說了。先看一下輸出:

    public static void main(String[] args) {
        System.out.println("2 1 = " + sqrt(2, 1));
        System.out.println("2 2 = " + sqrt(2, 2));
        System.out.println("2 3 = " + sqrt(2, 3));
        System.out.println("2 4 = " + sqrt(2, 4));
        System.out.println("3 2 = " + sqrt(3, 2));
        System.out.println("3 3 = " + sqrt(3, 3));
        System.out.println("25 4 = " + sqrt(25, 4));
        System.out.println("25 6 = " + sqrt(25, 6));
    }

輸出

2 1 = 1.4000000000000004
2 2 = 1.41
2 3 = 1.414
2 4 = 1.4142
3 2 = 1.7300000000000004
3 3 = 1.7320000000000004
25 4 = 5.0000099999999925
25 6 = 5.000000099999996

由於double精度的問題,輸出並不完全滿足要求,當需要幾位精度的時候要截取前幾位。

另外,當輸入的整數比較大的時候,精度丟失也比較快:

2500 5 = 50.00000000000001
2500 6 = 49.999999500000015
25 6 = 5.000000099999996
25 7 = 4.999999949999996

可以看到給25開根號6位精度還行,給2500開的話,6位精度已經不能保證了。


上面的代碼在while確定整數部分的時候可以優化,並不需要把所有小於平方根的數都過濾一遍。讀者可以嘗試一下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM