话不多说,直接上代码(注释详细):
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"));
}
}