一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - java大數乘法的簡單實現 浮點數乘法運算

java大數乘法的簡單實現 浮點數乘法運算

2019-11-03 17:46java技術網 JAVA教程

大數乘法可以進行任意大小和精度的整數和浮點數的乘法運算, 精確度很高, 可以用作經融等領域的計算,這個是我看了一些資料, 然后自己整理實現的,簡單測試了一下

代碼如下:


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 大數乘法的簡單實現, 目前還不是很完善
 * Fix: 
 * 1. 修改前后刪除0的一些錯誤情況
 * 2. 支持負數運算
 * 3. 判斷輸入字符串是否符合小數定義, 用正則表達式判斷
 * @author icejoywoo
 * @since 2012.2.16
 * @version 0.1.1
 */
public class BigNumber {
    public static void main(String[] args) throws IOException {
        System.out.println("Input two large integers:");
        BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
        String[] strArray = buffer.readLine().split("\\*");
        System.out.println(bigNumberMultiply(strArray[0], strArray[1]));
    }

    /**
     * 計算兩個任意大小和精度的數的乘積
     * @param first 第一個參數
     * @param second 第二個參數
     * @return 兩個數的乘積
     */
    private static String bigNumberMultiply(String first, String second) {
        // 正負號判斷標志
        boolean flag = false;

        if (first.charAt(0) == '-') {
            flag = !flag;
            first = first.substring(1);
        }

        if (second.charAt(0) == '-') {
            flag = !flag;
            second = second.substring(1);
        }

        // 小數點的位置
        int aPoints = first.length() - first.indexOf('.') - 1;
        int bPoints = second.length() - second.indexOf('.') - 1;
        int pointPos = aPoints + bPoints; // 結果的小數點位置

        // 刪除小數點
        StringBuffer aBuffer = new StringBuffer(first.replaceAll("\\.", ""));
        StringBuffer bBuffer = new StringBuffer(second.replaceAll("\\.", ""));

        int[] a = string2IntArray(aBuffer.toString());
        int[] b = string2IntArray(bBuffer.toString());

        int[] result = new int[a.length + b.length - 1]; // 保存結果的數組

        // 計算
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < b.length; j++) {
                result[i + j] += a[i] * b[j];
            }
        }

        // result中的某一位大于9的話需要進位
        for (int i = result.length - 1; i >= 0; --i) {
            if (result[i] > 9) {
                result[i - 1] += result[i] / 10;
                result[i] = result[i] % 10;
            }
        }

        StringBuffer buffer = new StringBuffer(); // 將result數組轉換為字符串
        for (int i = 0; i < result.length; ++i) {
            // 添加小數點
            if(result.length - i == pointPos) {
                buffer.append(".");
            }
            buffer.append(String.valueOf(result[i]));
        }

        if (buffer.indexOf(".") != -1)
        {
            // 刪除最開始的0
            int i = 0;
            while (i < buffer.length()) {
                if (buffer.length() > 2 && buffer.charAt(i+1) == '.') { // 小數點前只有一個數 0.
                    break;
                } else if (buffer.charAt(i) == '0') { // 刪除最前邊的0
                    buffer.deleteCharAt(i);
                    i = 0;
                    continue;
                } else { // 當第一位不是0的時候
                    break;
                }
            }

            // 刪除末尾的0
            i = buffer.length() - 1;
            while (i >= 0) {
                if (buffer.length() > 2 && buffer.charAt(i-1) == '.') { // 小數點后直接是數字
                    break;
                } else if (buffer.charAt(i) == '0') { // 刪除末尾的0
                    buffer.deleteCharAt(i);
                    i = buffer.length() - 1;
                    continue;
                } else { // 當最后一位不是0的時候
                    break;
                }
            }
        }

        // 根據符號位, 返回值的正負標志
        if (flag) {
            return "-" + buffer.toString();
        } else {
            return buffer.toString();
        }
    }

    /**
     * 將字符串裝換為數組
     * @param number
     * @return
     */
    private static int[] string2IntArray(String number) {
        // 判斷輸入是否符合浮點數的要求
        Pattern pattern = Pattern.compile("^(-?\\d+|\\d*)\\.?\\d*$");
        Matcher matcher = pattern.matcher(number);
        if (!matcher.find()) {
            throw new IllegalArgumentException("輸入的數不正確!");
        }

        int[] result = new int[number.length()];
        for (int i = 0; i < number.length(); i++) {
            result[i] = (int) (number.charAt(i) - '0');
        }
        return result;
    }
}

 

運行結果如下:

1. 錯誤輸入的判斷

復制代碼代碼如下:


Input two large integers:
1a*a22
Exception in thread "main" java.lang.IllegalArgumentException: 輸入的數不正確!
at BigNumber.string2IntArray(BigNumber.java:132)
at BigNumber.bigNumberMultiply(BigNumber.java:54)
at BigNumber.main(BigNumber.java:22)



 2. 帶負數的運算, 前后帶有0的情況

復制代碼代碼如下:


Input two large integers:
-23424.2300*02345.23400000
-54935300.61982


 python中計算的結果如下

復制代碼代碼如下:


Python 2.6.5
>>> -23424.2300*02345.23400000
-54935300.619819999


 可以看出python的結果是有失真的

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美国产精品久久 | 91制片厂果冻星空传媒3xg | java hd国产高清 | 亚洲国产精品热久久 | 亚洲精品一区二区久久这里 | 色姑娘久久 | 日韩在线观看一区二区不卡视频 | 欧美成人momandson | 欧美日韩亚洲第一区在线 | avtt天堂网 手机资源 | 边摸边吃奶边做爽视频免费 | 国产66| 学生小泬无遮挡女HD | 国产99视频精品免费视频7 | 果冻传媒 天美 麻豆 | 四虎永久在线精品免费影视 | 国产一级在线免费观看 | 高清男的插曲女的 欢迎你老狼 | 狠狠久久久久综合网 | 人体做爰aaaa免费 | 人皮高跟鞋在线观看 | 美女精品永久福利在线 | 好男人免费高清在线观看2019 | 奇米影视在线视频8888 | 国产精品嫩草影院一二三区入口 | 日韩欧美中文字幕一区二区三区 | 午夜久久免影院欧洲 | 日本sss| 男人桶女下面60分钟视频 | 摸进老太婆的裤裆小说 | 国产日韩欧美不卡www | 亚洲国产精品二区久久 | fuqer日本老师 | 日韩欧美一区二区三区视频 | 久久99re8热在线播放 | 调教开发新婚娇妻放荡 | 成人久久网站 | 美女黄板视频 | 97国产蝌蚪视频在线观看 | 插入逼 | 99久久一香蕉国产线看观看 |