最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java大數(shù)乘法的簡單實現(xiàn) 浮點數(shù)乘法運算

 更新時間:2014年01月20日 11:22:56   作者:  
大數(shù)乘法可以進(jìn)行任意大小和精度的整數(shù)和浮點數(shù)的乘法運算, 精確度很高, 可以用作經(jīng)融等領(lǐng)域的計算,這個是我看了一些資料, 然后自己整理實現(xiàn)的,簡單測試了一下

復(fù)制代碼 代碼如下:

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

/**
 * 大數(shù)乘法的簡單實現(xiàn), 目前還不是很完善
 * Fix:
 * 1. 修改前后刪除0的一些錯誤情況
 * 2. 支持負(fù)數(shù)運算
 * 3. 判斷輸入字符串是否符合小數(shù)定義, 用正則表達(dá)式判斷
 * @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]));
    }

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

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

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

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

        // 刪除小數(shù)點
        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]; // 保存結(jié)果的數(shù)組

        // 計算
        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的話需要進(jìn)位
        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數(shù)組轉(zhuǎn)換為字符串
        for (int i = 0; i < result.length; ++i) {
            // 添加小數(shù)點
            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) == '.') { // 小數(shù)點前只有一個數(shù) 0.
                    break;
                } else if (buffer.charAt(i) == '0') { // 刪除最前邊的0
                    buffer.deleteCharAt(i);
                    i = 0;
                    continue;
                } else { // 當(dāng)?shù)谝晃徊皇?的時候
                    break;
                }
            }

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

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

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

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

運行結(jié)果如下:

1. 錯誤輸入的判斷

復(fù)制代碼 代碼如下:

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


 2. 帶負(fù)數(shù)的運算, 前后帶有0的情況
復(fù)制代碼 代碼如下:

Input two large integers:
-23424.2300*02345.23400000
-54935300.61982

 python中計算的結(jié)果如下
復(fù)制代碼 代碼如下:

Python 2.6.5
>>> -23424.2300*02345.23400000
-54935300.619819999

 可以看出python的結(jié)果是有失真的

相關(guān)文章

  • Java拖曳鼠標(biāo)實現(xiàn)畫線功能的方法

    Java拖曳鼠標(biāo)實現(xiàn)畫線功能的方法

    這篇文章主要介紹了Java拖曳鼠標(biāo)實現(xiàn)畫線功能的方法,需要的朋友可以參考下
    2014-07-07
  • idea中創(chuàng)建新類時自動添加注釋的實現(xiàn)

    idea中創(chuàng)建新類時自動添加注釋的實現(xiàn)

    在每次使用idea創(chuàng)建一個新類時,過了一段時間發(fā)現(xiàn)看不懂這個類是用來干嘛的,為了解決這個問題,我們可以設(shè)置在創(chuàng)建一個新類時自動添加注釋,幫助我們理解這個類的用處,本文主要介紹了在idea中創(chuàng)建新類時自動添加注釋的實現(xiàn),感興趣的可以了解一下
    2025-03-03
  • Java利用蒙特卡洛方法求解圓周率π值

    Java利用蒙特卡洛方法求解圓周率π值

    蒙特·卡羅方法(Monte Carlo method),也稱統(tǒng)計模擬方法,是一種以概率統(tǒng)計理論為基礎(chǔ)的數(shù)值計算方法。本文將利用該方法實現(xiàn)圓周率的計算,需要的可以參考一下
    2022-08-08
  • Springcloud-nacos實現(xiàn)配置和注冊中心的方法

    Springcloud-nacos實現(xiàn)配置和注冊中心的方法

    這篇文章主要介紹了Springcloud-nacos實現(xiàn)配置和注冊中心的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 如何處理maven倉庫中后綴LastUpdated文件

    如何處理maven倉庫中后綴LastUpdated文件

    這篇文章主要介紹了如何處理maven倉庫中后綴LastUpdated文件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • 啟動springboot應(yīng)用因未配置數(shù)據(jù)庫報錯的解決方案

    啟動springboot應(yīng)用因未配置數(shù)據(jù)庫報錯的解決方案

    這篇文章主要介紹了啟動springboot應(yīng)用因未配置數(shù)據(jù)庫報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • springboot使用注解獲取yml配置的兩種方法

    springboot使用注解獲取yml配置的兩種方法

    本文主要介紹了springboot使用注解獲取yml配置的兩種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • java 的Collection接口實例詳解

    java 的Collection接口實例詳解

    本文主要介紹java 中的Collection接口框架知識,并附實例代碼供大家學(xué)習(xí)參考,希望能幫助有需要的小伙伴
    2016-07-07
  • Java21新特性Record?Patterns示例詳解

    Java21新特性Record?Patterns示例詳解

    這篇文章主要為大家介紹了Java21新特性Record?Patterns示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • springboot tomcat的maxHttpFormPostSize參數(shù)示例解析

    springboot tomcat的maxHttpFormPostSize參數(shù)示例解析

    這篇文章主要介紹了springboot tomcat的maxHttpFormPostSize參數(shù)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08

最新評論

炉霍县| 同仁县| 浠水县| 鹤峰县| 沈丘县| 镇江市| 印江| 乐都县| 大冶市| 洪泽县| 纳雍县| 栖霞市| 塔城市| 缙云县| 夹江县| 美姑县| 莱芜市| 潼关县| 北安市| 南城县| 达孜县| 尖扎县| 英山县| 徐汇区| 开原市| 长宁区| 城市| 崇义县| 虹口区| 潼关县| 夏津县| 秀山| 靖边县| 古田县| 康保县| 新竹市| 阿合奇县| 霍山县| 昌黎县| 奉节县| 沛县|