面试遇到的问题字符串式小数相加,返回字符串

package com.javause.useStr.addString;

public class Solution {
    public static void main(String[] args) {
        // 定义两个小数,做字符串小数相加。
        String a = "1.234";
        String b = "2.874";
        // 将两个字符串式的小数相加,返回字符串形式的结果
        System.out.println(doStringPlus(a, b));

    }

    private static String doStringPlus(String a, String b) {
        String result = "";
        // 确定.的位置
        int posa = a.indexOf(".");
        int posb = b.indexOf(".");
        // a的整数部分
        String parta1 = a.substring(0, posa);
        // a的小数部分
        String parta2 = a.substring(posa + 1, a.length());
        int a2length = parta2.length();
        // b的整数部分
        String partb1 = b.substring(0, posb);
        // b的整数部分
        String partb2 = b.substring(posb + 1, b.length());
        int b2length = partb2.length();
        // 两个小数部分的最大长度
        int length = Math.max(a2length, b2length);
        // 小数部分的长度不同
        if (a2length != b2length) {
            // 第二个数的小数部分长
            if (length > a2length) {
                // 第一个数的小数部分添加0使长度相同
                int minus = length - a2length;
                for (int i = 0; i < minus; i++) {
                    parta2 = parta2 + "0";
                }
            }
            // 第一个数的小数部分长
            if (length > b2length) {
                // 第二个数的小数部分添加0,使长度相同
                int minus = length - b2length;
                for (int i = 0; i < minus; i++) {
                    partb2 = partb2 + "0";
                }
            }
        }
        // 整数部分相加
        int num1 = Integer.valueOf(parta1) + Integer.valueOf(partb1);
        // 小数部分相加
        int num2 = Integer.valueOf(parta2) + Integer.valueOf(partb2);
        // 小数部分转为字符串
        String string2 = String.valueOf(num2);
        int s2length = string2.length();
        // 小数部分最高位有进位
        if (s2length > length) {
            // 将小数部分最高位去掉
            string2 = string2.substring(1, s2length);
            // 添加到整数部分
            num1 = num1 + 1;
        } else if (s2length < length) {
            // 高位补零,防止加后结果高位少了0,090变成90
            int minus = length - s2length;
            for (int k = 0; k < minus; k++) {
                string2 = "0" + string2;
            }
        }

        String string1 = String.valueOf(num1);
        // 将小数末尾的0去掉
        // 重新计算s2的长度
        s2length = string2.length();
        for (int k = 0; k < s2length; k++) {
            if (string2.endsWith("0")) {
                string2 = string2.substring(0, s2length - 1 - k);
            }
        }
        // 末尾全部是o时,去掉小数点

        if (string2.length() == 0) {
            result = string1;
        } else {
            result = string1 + "." + string2;
        }

        return result;
    }
}

 

转载于:https://my.oschina.net/iioschina/blog/895816

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值