美文网首页
只使用处理I/O的printDigit方法,编写一种方法以输出任

只使用处理I/O的printDigit方法,编写一种方法以输出任

作者: 蝉鸣的雨 | 来源:发表于2019-02-25 22:56 被阅读7次

    只使用处理I/OprintDigit方法,编写一种方法以输出任意double型量(可以是负值)

    解答:

    思路:

    1. 判断正负,并将负数转换为正数
    2. 获取整数部分及小数部分的数字长度(intLengthdigitLength)
    3. 推理过程:

    例如:数字 n = 12.359
    其中:intLength = 2, digitLength = 3
    基准情形为:
    1 -> (int) n * 10^(-1) % 10
    2 -> (int) n * 10^(0) % 10
    3 -> (int) n * 10^(1) % 10
    5 -> (int) n * 10^(2) % 10
    9 -> (int) n * 10^(3) % 10
    归纳:m = (int) n * 10^(-intLength + 1) % 10
    其中,当 (-intLength + 1) == digitLength 时,可判定递归结束。

    代码如下:

        private void answer() {
            double num = -0.6789;
            // 判定负值情况
            if (num < 0) {
                System.out.print("-");
                num = Math.abs(num);
            }
            // 获取整数部分
            int a = (int) num;
            // 整数部分的长度
            int intLength = String.valueOf(a).length();
            // 小数部分的长度
            int digitLength = 0;
            if (String.valueOf(num).contains(".")) {
                // 如果 num = 123.0,此时的 0 也打印
                digitLength = String.valueOf(num).length() - intLength - 1;
            }
            printDigit(num, -intLength, digitLength);
        }
    
        private void printDigit(double n, int intLength, int digitLength) {
            // 递归结束标记
            if (intLength == digitLength) return;
            intLength = intLength + 1;
            int a = (int) (n * Math.pow(10, intLength));
            int num = a % 10;
            System.out.print(num);
            // 判定小数点位置
            if (intLength == 0) {
                System.out.print(".");
            }
            printDigit(n, intLength, digitLength);
        }
    

    注意事项:

    由于传入的参数是DOUBLE类型,所以在进行递归计算时,会出现小数部分不准确的问题,导致最后打印出来的内容与传入的值不等的情况。这种情况暂时没有一个好的解决方案,毕竟DOUBLEFLOAT是属于浮点类型,这是语言设计时的设定。

    PS: 可以考虑使用BigDecimal代替DOUBLE

    相关文章

      网友评论

          本文标题:只使用处理I/O的printDigit方法,编写一种方法以输出任

          本文链接:https://www.haomeiwen.com/subject/hkanyqtx.html