1.3
现在要输出一个任意的Double型数 例如76823.25
思路: 可以把它分为整数和小数部分分别输出,再用”.”连接
正负数判断一下就行
1.整数部分很简单和前面的一样
2.小数部分:将0.25化为整数在调用1处的方法
?怎么判断一个数的小数位位数呢?
我的思路:我可以将已知double型变量转化为String类型这样输出就很简单了
但是题目的本来意思是要我们用递归来完成
下面的程序是我参考 博客上:吴磊 的程序
下面的程序思路很正确,也使用了递归,但是在实际运行中会出现误差错误
无法得到我们想要的输出的值,有兴趣的可以运行一下.
这个程序就引出了我们java中的浮点数计算间出现的误差问题了,下一篇我将详细解读它
public class TestDemo31 {
public static void main(String[] args) {
output(675454.65);
}
static void output(double num){
//正负号
if(num < 0){
System.out.print("-");
}
//整数
long digit = Math.abs((long)num);
if(digit < 1){
System.out.print("0");
}else{
printDigit(digit);
}
//小数点
System.out.print(".");
//小数部分
double decimal = Math.abs(num-(long) num); //取整使用(long)
if(decimal > 0){
printDigit(decimal);
}else{
System.out.print("0");
}
}
static void printDigit(double num){
if(num > 1){
printDigit((long)(num/10)); //不可遗漏long
System.out.print((long)(num%10)); //不可遗漏long
}else if(num > 0 && num < 1){
long digit = (long) (num*10);
System.out.print(digit);
printDigit(num*10 - digit);
//这里会出现误差错误
}else if(num == 1){
System.out.print("1");
}
}
}
/*PS:Java中所有数字都是带符号的,没有unsigned,
int在java中是固定的32bits,表示的范围为-2^31到2^31-1
-2147483648到2147483647才是正确的! 10位
-----------------------------------------------------------------------------------------------
System.out.println(Integer.MAX_VALUE); //2的31次方-1,10个数位,正的20亿左右,用在钱上面不一定够
System.out.println(Integer.MIN_VALUE); //负的2的31次方
2147483647
-2147483648
-----------------------------------------------------------------------------------------------
System.out.println(Long.MAX_VALUE); //2的63次方-1, 19个数位,很大了,可放心用在钱上面
System.out.println(Long.MIN_VALUE); //负的2的63次方
9223372036854775807
-9223372036854775808
-----------------------------------------------------------------------------------------------
System.out.println(Float.MAX_VALUE); //2的128次方-1, 38个数位,比long多了一倍,这个主要用来做简单数学精确运算使用
System.out.println(Float.MIN_VALUE); //2的-149次方
3.4028235E38
1.4E-45
-----------------------------------------------------------------------------------------------
System.out.println(Double.MAX_VALUE); //2的1024次方-1,308个数位,是float数位的10倍,主要用来做复杂运算和天文运算
System.out.println(Double.MIN_VALUE); //2的-1024次方
1.7976931348623157E308
4.9E-324
*/
下面我们来看一下出现误差错误的地方:
public class Exercise {
public static void main(String[] args) {
double d=12345.6789;
System.out.println((long)d);
double decimal=d-12345;
//这里会发生误差得到的结果不是想要的
//我们想要的结果是0.6789,但是他却得出0.6789000000007945
System.out.println(decimal);
}
程序中(long)d输出的就是12345
d-12345=0.6789这是我们想要的,但是他却得出0.6789000000007945
在下一篇中我们将详细探讨关于Java中浮点型数的误差问题