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

2019-02-25  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读