您当前的位置: 首页 > 

庄小焱

暂无认证

  • 0浏览

    0关注

    805博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

String转Doblue计算出现精度损失的问题

庄小焱 发布时间:2020-09-23 13:59:50 ,浏览量:0

    public static void main(String[] args) {
        String s1 = "0.21";
        System.out.println(Double.valueOf(s1));
        String s2 = "0.02";
        System.out.println(Double.valueOf(s2));
        System.out.println(0.21 + 0.02);
        double sum = Double.valueOf(s1) + Double.valueOf(s2);
        double d1 = 0.21;
        double d2 = 0.02;
        double sum2 = d1 + d2;
        System.out.println(sum);
        System.out.println(sum2);
    }

 首先我把2个字符串s1和s2以小数点分割,分成整数部分和小数部分,如果没有小数点直接求和运算就能得到结果所以不考虑这个情况,接下来,我把分成整数和小数部分我都当成整数求和,那么就只要判断小数相加后有没进位就可,一般相加进位只有1,最后把整数和小数部分一拼接就好了,输出的字符串就是结果了,你可以把这个String类型以任意你想要的int,double等类型返回也是可以的。

    public static void test() {
        String s1 = "0.99";
        String s2 = "0.886";
        String[] shuZi1 = null, shuZi2 = null;
        int num1 = 0, num10 = 0, num2 = 0, num20 = 0;
        int shuZi1xiaoShuChangDu = 0, shuZi2xiaoShuChangDu = 0;
        Integer xiaoShuHe = 0, numHe = 0;
        double zongHe = 0.0;
        String jinWei = "0";
        //判断s1,s2是否有小数位
        if (s1.indexOf(".") != -1) {
            shuZi1 = s1.split("\\.");
            num1 = Integer.valueOf(shuZi1[0]);
            num10 = Integer.valueOf(shuZi1[1]);
        } else {
            num1 = Integer.valueOf(s1);
        }
        if (s2.indexOf(".") != -1) {
            shuZi2 = s2.split("\\.");
            num2 = Integer.valueOf(shuZi2[0]);
            num20 = Integer.valueOf(shuZi2[1]);
        } else {
            num2 = Integer.valueOf(s2);
        }
        //计算小数位,短的数要乘上对应的10才可和长的数同级相加
        if (num10 != 0 && num20 != 0) {
            if (shuZi1[1].length() > shuZi2[1].length()) {
                shuZi1xiaoShuChangDu = shuZi1[1].length();
                int count = shuZi1[1].length() - shuZi2[1].length();
                for (int m = 0; m < count; m++) {
                    num20 = num20 * 10;
                }
            } else {
                shuZi2xiaoShuChangDu = shuZi2[1].length();
                int count = shuZi2[1].length() - shuZi1[1].length();
                for (int n = 0; n < count; n++) {
                    num10 = num10 * 10;
                }
            }
            xiaoShuHe = num20 + num10;
            //如果小数部分相加大于原先最长长度说明有进位
            if (xiaoShuHe.toString().length() > (shuZi1xiaoShuChangDu + shuZi2xiaoShuChangDu)) {
                jinWei = xiaoShuHe.toString().substring(0, (xiaoShuHe.toString().length() - (shuZi1xiaoShuChangDu + shuZi2xiaoShuChangDu)));
            }
        } else {
            xiaoShuHe = num20 + num10;
        }
        numHe = num2 + num1;
        System.out.println("小数和=" + xiaoShuHe + "进位=" + jinWei);
        System.out.println("整数和=" + numHe);
        if (!jinWei.equals("0")) {
            numHe = numHe.intValue() + 1;
            String sum = numHe.toString() + "." + xiaoShuHe.toString().substring(1);
            zongHe = Double.parseDouble(sum);
        } else {
            String sum = numHe.toString() + "." + xiaoShuHe.toString();
            zongHe = Double.parseDouble(sum);
        }
        System.out.println("总和=" + zongHe);
    }

或者是使用java中的BigDecimal

public static void main(String[] args) {
        BigDecimal sum3 = new BigDecimal("0.21").add(new BigDecimal("0.02"));
        System.out.println(sum3);
    }

 

关注
打赏
1657692713
查看更多评论
立即登录/注册

微信扫码登录

0.0421s