java大數(shù)乘法的簡(jiǎn)單實(shí)現(xiàn) 浮點(diǎn)數(shù)乘法運(yùn)算
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 大數(shù)乘法的簡(jiǎn)單實(shí)現(xiàn), 目前還不是很完善
* Fix:
* 1. 修改前后刪除0的一些錯(cuò)誤情況
* 2. 支持負(fù)數(shù)運(yùn)算
* 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]));
}
/**
* 計(jì)算兩個(gè)任意大小和精度的數(shù)的乘積
* @param first 第一個(gè)參數(shù)
* @param second 第二個(gè)參數(shù)
* @return 兩個(gè)數(shù)的乘積
*/
private static String bigNumberMultiply(String first, String second) {
// 正負(fù)號(hào)判斷標(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ù)點(diǎn)的位置
int aPoints = first.length() - first.indexOf('.') - 1;
int bPoints = second.length() - second.indexOf('.') - 1;
int pointPos = aPoints + bPoints; // 結(jié)果的小數(shù)點(diǎn)位置
// 刪除小數(shù)點(diǎn)
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ù)組
// 計(jì)算
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ù)點(diǎn)
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ù)點(diǎn)前只有一個(gè)數(shù) 0.
break;
} else if (buffer.charAt(i) == '0') { // 刪除最前邊的0
buffer.deleteCharAt(i);
i = 0;
continue;
} else { // 當(dāng)?shù)谝晃徊皇?的時(shí)候
break;
}
}
// 刪除末尾的0
i = buffer.length() - 1;
while (i >= 0) {
if (buffer.length() > 2 && buffer.charAt(i-1) == '.') { // 小數(shù)點(diǎn)后直接是數(shù)字
break;
} else if (buffer.charAt(i) == '0') { // 刪除末尾的0
buffer.deleteCharAt(i);
i = buffer.length() - 1;
continue;
} else { // 當(dāng)最后一位不是0的時(shí)候
break;
}
}
}
// 根據(jù)符號(hào)位, 返回值的正負(fù)標(biāo)志
if (flag) {
return "-" + buffer.toString();
} else {
return buffer.toString();
}
}
/**
* 將字符串裝換為數(shù)組
* @param number
* @return
*/
private static int[] string2IntArray(String number) {
// 判斷輸入是否符合浮點(diǎn)數(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;
}
}
運(yùn)行結(jié)果如下:
1. 錯(cuò)誤輸入的判斷
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ù)的運(yùn)算, 前后帶有0的情況
Input two large integers:
-23424.2300*02345.23400000
-54935300.61982
python中計(jì)算的結(jié)果如下
Python 2.6.5
>>> -23424.2300*02345.23400000
-54935300.619819999
可以看出python的結(jié)果是有失真的
- Java使用BigDecimal精確運(yùn)算浮點(diǎn)數(shù)
- java.math包下計(jì)算浮點(diǎn)數(shù)和整數(shù)的類的實(shí)例
- Java判斷字符串是否是整數(shù)或者浮點(diǎn)數(shù)的方法
- JAVA浮點(diǎn)數(shù)計(jì)算精度損失底層原理與解決方案
- Java中浮點(diǎn)數(shù)精度問(wèn)題的解決方法
- Java中使用BigDecimal進(jìn)行浮點(diǎn)數(shù)運(yùn)算
- java實(shí)現(xiàn)浮點(diǎn)數(shù)轉(zhuǎn)人民幣的小例子
- Java中的浮點(diǎn)數(shù)分析
- Java正確比較浮點(diǎn)數(shù)的方法
相關(guān)文章
Java線程實(shí)現(xiàn)的三種方式詳細(xì)解析
這篇文章主要介紹了Java線程實(shí)現(xiàn)的三種方式詳細(xì)解析,Java多線程實(shí)現(xiàn)方式主要有三種,繼承Thread類、實(shí)現(xiàn)Runnable接口、使用ExecutorService、Callable、Future實(shí)現(xiàn)有返回結(jié)果的多線程,需要的朋友可以參考下2023-12-12java遞歸與非遞歸實(shí)現(xiàn)掃描文件夾下所有文件
這篇文章主要為大家詳細(xì)介紹了java遞歸與非遞歸實(shí)現(xiàn)掃描文件夾下所有文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02java中并發(fā)Queue種類與各自API特點(diǎn)以及使用場(chǎng)景說(shuō)明
這篇文章主要介紹了java中并發(fā)Queue種類與各自API特點(diǎn)以及使用場(chǎng)景說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06java正則表達(dá)式匹配規(guī)則超詳細(xì)總結(jié)
正則表達(dá)式并不僅限于某一種語(yǔ)言,但是在每種語(yǔ)言中有細(xì)微的差別,下面這篇文章主要給大家介紹了關(guān)于java正則表達(dá)式匹配規(guī)則的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10專屬于程序員的浪漫-Java輸出動(dòng)態(tài)閃圖iloveyou
這篇文章主要介紹了專屬于程序員的浪漫-Java輸出動(dòng)態(tài)閃圖iloveyou,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11解決MyEclipse下啟動(dòng)項(xiàng)目時(shí)JBoss內(nèi)存溢出的問(wèn)題
下面小編就為大家?guī)?lái)一篇解決MyEclipse下啟動(dòng)項(xiàng)目時(shí)JBoss內(nèi)存溢出的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07Spring條件注解@ConditionnalOnClass的原理分析
這篇文章主要介紹了Spring條件注解@ConditionnalOnClass的原理分析,所謂@ConditionalOnClass注解,翻譯過(guò)來(lái)就是基于class的條件,它為所標(biāo)注的類或方法添加限制條件,當(dāng)該條件的值為true時(shí),其所標(biāo)注的類或方法才能生效,需要的朋友可以參考下2023-12-12Spring?IOC容器Bean注解創(chuàng)建對(duì)象組件掃描
這篇文章主要為大家介紹了Spring?IOC容器Bean注解創(chuàng)建對(duì)象組件掃描,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05Java異常繼承結(jié)構(gòu)解析_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java異常繼承結(jié)構(gòu)解析的相關(guān)知識(shí),需要的朋友可以參考下2017-04-04