其实在写Java代码的时候,其实很少人会去考虑高精度运算,即使遇到无法避免高精度的计算问题也不会太烦恼,因为有大整数类BigInteger以及BigDecimal工具使用。
但是抛开Java不说,举例:为一家银行计算员工工资,使用JS去处理计算然后做页面展示的,但是因为银行系统 引入包是比较费劲的,所以第一次将高精度运算运用到工作中,之后由于使用Java越来越多,对于手撸高精度计算代码也就越来越少了。
直到使用C++刷PAT算法的时候,又不可避免的使用到高精度算法(因为long int和long long也无法解决整数长度受限的问题), 所以用Java来实现高精度的运算,除法就先放一放,因为高精度除高精度有点难,今天小编就给大家分享下高精度的加减乘。先看一下效果图(上方结果使用BigInteger的方法,下方结果自定义实现)
java高精度运算
高精度的加法是比较容易理解的和实现,我们只需要注意进位就好, 将输入整数的字符串,进行遍历,将char类型转为int进行相加,保存进位在下一轮循环中使用即可。
private static void add(String a, String b) {
System.out.println("加===");
BigInteger ba = new BigInteger(a);
BigInteger bb = new BigInteger(b);
System.out.println("结果=" + ba.add(bb));
String res = "";
int temp;
int adv = 0;
for (int i = a.length() - 1, j = b.length() - 1; i > -1 || j > -1; ) {
if (i > -1 && j > -1)
temp = (a.charAt(i--) - '0') + (b.charAt(j--) - '0');
else if (i > -1)
temp = (a.charAt(i--) - '0');
else
temp = (b.charAt(j--) - '0');
temp += adv;
adv = temp / 10;
res = temp % 10 + res;
if (adv != 0) {
res = adv + res;
System.out.println("结果=" + res);
高精度减法和加法比较,稍微复杂一些,因为在减法中,需要根据输入数字的相对大小来判断是否输出负号,还需要注意是否要"借位",以及对于结果进行高位去0
private static void sub(String a, String b) {
System.out.println("减===");
BigInteger ba = new BigInteger(a);
BigInteger bb = new BigInteger(b);
System.out.println("结果=" + ba.subtract(bb));
String res = "";
int temp;
int sub = 0;
String ch = "";
if (a.length() String c = a;
a = b;
b = c;
ch = "-";
for (int i = a.length() - 1, j = b.length() - 1; i > -1 || j > -1; ) {
if (i > -1 && j > -1) {
int tempA = a.charAt(i--) - '0' + sub;
sub = 0;
int tempB = b.charAt(j--) - '0';
if (tempA sub = -1;
temp = tempA + 10 - tempB;
} else {
temp = tempA - tempB;
} else if (i > -1) {
temp = (a.charAt(i--) - '0') + sub;
sub = 0;
} else {
temp = (b.charAt(j--) - '0') + sub;
sub = 0;
res = temp + res;
//高位去0
int spilt = 0;
for (int i = 0; i if (res.charAt(i) - '0' != 0) {
break;
} else {
spilt++;
res = res.substring(spilt);
System.out.println("结果=" + ch + res);
乘法和加法类似,但是因为涉及到累计相加的过程(模拟算术做竖式乘法的过程),所以结合数组更加方便理解一些
private static void multiply(String a, String b) {
System.out.println("乘法===");
BigInteger ba = new BigInteger(a);
BigInteger bb = new BigInteger(b);
System.out.println("结果=" + ba.multiply(bb));
int as[] = new int[a.length()];
int bs[] = new int[b.length()];
for (int i = 0; i as[i] = a.charAt(a.length() - i - 1) - '0';
for (int i = 0; i bs[i] = b.charAt(b.length() - i - 1) - '0';
int res[] = new int[b.length() + a.length()];
for (int i = 0; i int adv = 0;
int j;
for (j = 0; j res[i + j] = as[i] * bs[j] + adv + res[i + j];
adv = res[i + j] / 10;
res[i + j] = res[i + j] % 10;
res[i + j] = adv;
int len = a.length() + b.length() - 1;
if (res[len] == 0) len--;
System.out.printf("结果=");
for (int i = len; i >= 0; i--) {
System.out.printf(res[i] + "");
主函数:
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(http://System.in);
System.out.println("输入a");
String a = "";
if (scanner.hasNext())
a = scanner.next();
System.out.println("输入b");
String b = "";
if (scanner.hasNext())
b = scanner.next();
add(a, b);
sub(a, b);
multiply(a, b);
好了,以上就是今天的分享内容了,今天的知识你学到了吗?没学到没关系我们每天都会为大家分享。