1.3只使用处理I/O的printDigit方法,编写一种方法以输出任意Double型量(可以为负数)

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中浮点型数的误差问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值