PRELOADER

当前文章 : 《字符串实现大数相加(含小数)》

10/8/2019 —— 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
public class BigIntegerAdd {
public static String addInteger(String s1,String s2) {//整数大数相加
StringBuffer result = new StringBuffer();
//反转字符串,便于从低位相加
s1=new StringBuffer(s1).reverse().toString();
s2=new StringBuffer(s2).reverse().toString();
int len1=s1.length();
int len2=s2.length();
int maxlen=len1>len2?len1:len2;
//不足位补0,对齐数字
if(len1>len2){
for(int i=len2;i<len1;i++)
s2+="0";
}else if (len1<len2) {
for(int i=len1;i<len2;i++)
s1+="0";
}
boolean overflow=false;//溢出标志位
int takeflow=0;//进位标志位
//逐位相加
for(int i=0;i<maxlen;i++){
if(i==maxlen-1){
int sum=Integer.parseInt(s1.charAt(i)+"")+Integer.parseInt(s2.charAt(i)+"")+takeflow;
if(sum>9){
result.append(sum-10);
takeflow=1;
overflow=true;
}else {
result.append(sum);
takeflow=0;
}
}else {
int sum=Integer.parseInt(s1.charAt(i)+"")+Integer.parseInt(s2.charAt(i)+"")+takeflow;
if(sum>9){
result.append(sum-10);
takeflow=1;
}else {
result.append(sum);
takeflow=0;
}
}
}
if(overflow){
result.append(1);
}
return result.reverse().toString();
}

/**小数大数相加:
* 思路:
* 把两个数相加转成两个数的整数部分相加和两个数的小数部分相加*/
private static String addDecimal(String s1,String s2) {
int dindex1=s1.indexOf('.');//找出两个数的小数点位置,用于分割数字
int dindex2=s2.indexOf('.');
String z1 = "";//第一个数的整数部分
String z2 = "";//第二个数的整数部分
String d1 = "";//第一个数的小数部分
String d2 = "";
StringBuffer result = new StringBuffer();//存放结果
if(dindex1!=-1){//第一个数没有小数部分
z1=s1.substring(0, dindex1);
d1=s1.substring(dindex1+1);
}else{//有
z1=s1;
d1="";
}
if(dindex2!=-1){
z2=s2.substring(0, dindex2);
d2=s2.substring(dindex2+1);
}else{
z2=s2;
d2="";
}
result.append(addInteger(z1, z2));//两个数的整数部分相加结果
//求出两个数小数部分较长的一个的长度,可用于判断小数部分相加后有无进位
int maxlen=d1.length()>d2.length()?d1.length():d2.length();
String dres = addInteger(d1, d2);//小数部分相加结果
if (maxlen<dres.length()) {//小数部分相加后有进位
result=new StringBuffer(addInteger(result.toString(), "1"));
if (dindex1!=-1||dindex2!=-1) {//两个数中至少有一个带小数
result.append(".");
}
dres=dres.substring(1);
result.append(dres);
} else {//小数部分相加后无进位
if (dindex1!=-1||dindex2!=-1) {
result.append(".");
}
result.append(dres);
}
return result.toString();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(addDecimal("5.233", "8.99999999999999"));
}

}