java基础总结(六)--精度问题

先做个简单备份,后面再整理

package pri.lsx.test.bigdecimal;

import java.math.BigDecimal;

/**
 * 直接加是不行的参考http://www.cnblogs.com/chenssy/archive/2012/09/09/2677279.html
 *
 * @author lisx
 * @2017年5月27日
 */
public class Dome {

    public static void main(String[] args) {
        int a = 1;
        int b = 4;
        int c = a + b;
        double a2 = 1.0;
        double b2 = 4.0;
        double c2 = a2 + b2;
        double a3 = 1.000;
        double b3 = 4.000;
        double c3 = a3 + b3;
        double a4 = 1.1;
        double b4 = 4.1;
        double c4 = a4 + b4;

        //纯整数相加的运行结果也是对的
        System.out.println(c);

        //小数点后面是一个零运行的结果也是对的
        System.out.println(c2);

        //两个小数后面都有三个零运行的结果就有规定了
        System.out.println(c3); // 等于5.0而不是5.000

        //只有小数点后面是非零的小数,这样运行的结果才是错的
        System.out.println(c4);
        System.out.println(0.06 + 0.01);
        System.out.println(1.0 - 0.42);
        System.out.println(4.015 * 100);
        System.out.println(303.1 / 1000);

//		 下面使用bigDecimal方式试试
        double a5 = 1.1;
        double b5 = 4.1;

//		 对两个只有一位小数的double型数字进行精确的四则运算,这种计算方法无效
        BigDecimal a51 = new BigDecimal(a5);
        BigDecimal b51 = new BigDecimal(b5);
        System.out.println(a51.add(b51).doubleValue()); //加法
        System.out.println(a51.add(b51).doubleValue());

//		 换一种方式对a5和b5两个数值进行计算,这种方式才是对的我日
        BigDecimal a52 = new BigDecimal(Double.toString(a5));
        BigDecimal b52 = new BigDecimal(Double.toString(b5));
        System.out.println("Double.toString这个方法才是对的");
        System.out.println(a52.add(b52).doubleValue());

        //  两个字符串相加也是可以的
        String str1 = new String("1.1");
        String stz1 = new String("4.1");
        BigDecimal str2 = new BigDecimal(str1);
        BigDecimal stz2 = new BigDecimal(stz1);
        System.out.println("但是如果是字符型可以不用Double.toString这个方法");
        System.out.println(str2.add(stz2).doubleValue());

//		 若精度超过了double的精度,还能精确计算吗?
        double a6 = 1.111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111;
        double b6 = 4.111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111;
        System.out.println(a6 + b6);    // 直接相加会出问题

        //下面试下BigDecimal方法
        BigDecimal a61 = new BigDecimal(Double.toString(a6));
        BigDecimal b62 = new BigDecimal(Double.toString(b6));
        System.out.println("超出精度的计算,Double.toString这个方法会把多余的给省掉");
        System.out.println(a61.add(b62));
    }
}

输出结果:

5
5.0
5.0
5.199999999999999
0.06999999999999999
0.5800000000000001
401.49999999999994
0.30310000000000004
5.199999999999999
5.199999999999999
Double.toString这个方法才是对的
5.2
但是如果是字符型可以不用Double.toString这个方法
5.2
5.222222222222221
超出精度的计算,Double.toString这个方法会把多余的给省掉
5.2222222222222222


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋天的猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值