zoukankan      html  css  js  c++  java
  • java 实现前面带零的数字进行加减运算(保留前面的0)

    1.情景展示

      比方说,有一数字000122,进行加法运算+1后,返回000123,如何实现?

    2.原因分析

      我们知道,在java中,只要是数字,用代表数字类型的数据类型(byte、short、int、long、double、float、BigDecimal)一旦接收,不管数字前方有几个0,都会被吃掉。

      所以,我们要想被加数前面有0,必须用字符串来接收,也就是:

      String number = “000122”,而不是int i = 000122;

      要想进行加减运算,我们就必须将其转换成基本数据类型,进行运算,此时,前面的0已经消失了,所以,我们还要进行补零操作。 

    3.解决方案

    /*
     * 加法、减法计算(整数之间的运算)
     * @attention: 不支持被加数以0开头,且被加数+加数>9223372036854775807的整数求和运算
     * BigDecimal支持小数运算,该函数只支持整数之间的运算
     * @date: 2020年11月11日 0011 16:28
     * @param: augend 被加数(前面可以带0)
     * @param: addend 加数(可以为负数)
     * @return: java.lang.String 返回字符串是因为:如果前面有0,转数字的话,0会被吞掉
     */
    public static String numberAddition(String augend, int addend) {
        if (!isWholeNumber(augend)) return "被加数不是整数,无法进行加法运算";
    
        // 以0开头,说明进行加法运算后需要进行补零操作
        if (augend.startsWith("0")) {
            // 校验是否大于long类型的最大值:9223372036854775807
            long augendNum;
            try {
                // 因为String.format()不支持BigDecimal运算,只支持基本数据类型,所以无法调用format()直接进行补零操作
                augendNum = Long.parseLong(augend);
            } catch (NumberFormatException n) {
                return "被加数>long类型的最大值9223372036854775807";
            }
    
            long result = augendNum + addend;
            // 被加数>0,被加数>加数的绝对值,这样result肯定应该大于0
            if (augendNum > 0 && augendNum > Math.abs(addend) && result < 0) {
                return "被加数以0开头,且被加数+加数>long类型的最大值9223372036854775807";
            }
    
            // 字符串转数字,前面的0会消失(按原来的长度进行补零)
            // return String.format("%0" + augend.length() + "d", Integer.parseInt(augend) + addend);
            return String.format("%0" + augend.length() + "d", Long.parseLong(augend) + addend);
        }
    
        if (!augend.startsWith("0")) {
            // 被加数不以0开头且被加数+加数>9223372036854775807
            BigDecimal resultBg = new BigDecimal(augend).add(new BigDecimal(addend));
            if (resultBg.compareTo(new BigDecimal(Long.MAX_VALUE)) == 1) {
                return String.valueOf(resultBg);
            } else {
                // 正常的整数运算
                return String.valueOf(Long.parseLong(augend) + addend);
            }
        }
    
        // 不会执行(走不到这儿)
        return "";
    }
    

    4.测试

    public static void main(String[] args) {
        System.out.println(numberAddition("2020111100017420201111000174", 1));
        System.out.println(numberAddition("00009223372036854775806", 1));
        System.out.println(numberAddition("009223372036854775807", 2));
        System.out.println(numberAddition("0000134", 1));
        System.out.println(numberAddition("122", 1));
    }
    

     

    写在最后

      哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

     相关推荐:

  • 相关阅读:
    手动实现 SpringMVC
    2014年9月9日 高级命令command的使用(上)
    2014年8月29日 透视图补充及视图开头
    2014年8月24日 菜单 工具条 右键菜单(上下文菜单)
    2014年8月14日 透视图
    2014年8月8日
    2014年8月1日
    关于EMF中从schema到ecore转变中的默认处理问题
    JAVA一些常用的时间操作
    echarts基本使用
  • 原文地址:https://www.cnblogs.com/Marydon20170307/p/13964031.html
Copyright © 2011-2022 走看看