只使用处理I/O
的printDigit
方法,编写一种方法以输出任意double
型量(可以是负值)
解答:
思路:
- 判断正负,并将负数转换为正数
- 获取整数部分及小数部分的数字长度(
intLength
和digitLength
)- 推理过程:
例如:数字 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
类型,所以在进行递归计算时,会出现小数部分不准确的问题,导致最后打印出来的内容与传入的值不等的情况。这种情况暂时没有一个好的解决方案,毕竟DOUBLE
和FLOAT
是属于浮点类型,这是语言设计时的设定。
PS: 可以考虑使用
BigDecimal
代替DOUBLE
。
网友评论