字符串实现大数相加(含小数) 2019-08-09 算法 Java 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798public 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")); }}