美文网首页零碎知识点程序员Java学习笔记
java——浮点数不精确的解决办法

java——浮点数不精确的解决办法

作者: YY程序猿 | 来源:发表于2017-07-09 13:54 被阅读70次

问题案例

由于计算机系统的特性,java浮点数(float、double)的精度有时候会不准确,案例代码如下:

        System.out.println(0.09 + 0.01);
        System.out.println(1.0 - 0.32);
        System.out.println(1.015 * 100);
        System.out.println(1.301 / 100);

输出结果


输出结果

发生了计算结果精度有误差的问题

解决办法

利用BigDecimal类(包:java.math.BigDecimal)解决计算误差问题

  • 1、加减乘解决办法
    BigDecimal类创建对象时有多个重载方法,推荐使用参数为String的构造方法创建对象进行计算,因为String可以表示无限长度的数,而int、long、float等表示的数的范围是有限的,代码如下:
        /** 加 */
        BigDecimal b1 = new BigDecimal("0.09");
        BigDecimal b2 = new BigDecimal("0.01");
        BigDecimal bigAdd = b1.add(b2);
        System.out.println(bigAdd);
        
        /** 减 */
        BigDecimal b3 = new BigDecimal("1");
        BigDecimal b4 = new BigDecimal("0.32");
        BigDecimal bigSub = b3.subtract(b4);
        System.out.println(bigSub);
        
        /** 乘 */
        BigDecimal b5 = new BigDecimal("1.015");
        BigDecimal b6 = new BigDecimal("100");
        BigDecimal bigMul = b5.multiply(b6);
        System.out.println(bigMul);

输出结果


输出结果
  • 2、除解决方法
    为什么除与加减乘不一样,因为除会涉及到除不尽的问题,小数点后是无限的,所以它不知道该如何显示,就会抛出异常,例如:
        BigDecimal b1 = new BigDecimal("1.301");
        BigDecimal b2 = new BigDecimal("101");
        BigDecimal bigDiv = b1.divide(b2);
        System.out.println(bigDiv);

输出结果


输出结果

所以应该用divide()的一个重载方法:public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode),来设置精确到多少位:

        /** 除
         *  参数1:被除数
         *  参数2:精确到第N位
         *  参数3:N位后的数的取舍方式,填BigDecimal定义好的常量
         *          通常用以下三个常量:
         *          ROUND_HALF_UP    表示N位后的那一位四舍五入
         *          ROUND_UP          表示N位后的那一位直接入
         *          ROUND_DOWN      表示N位后的那一位直接舍
         *          当然,取舍完后,第N位之后的通通丢弃
         */
        BigDecimal b1 = new BigDecimal("1.301");
        BigDecimal b2 = new BigDecimal("101");
        //精确到第5位
        BigDecimal bigDiv = b1.divide(b2,5,BigDecimal.ROUND_HALF_UP);
        //精确到第4位,第5位四舍五入
        BigDecimal bigDiv1 = b1.divide(b2,4,BigDecimal.ROUND_HALF_UP);
        //精确到第4位,第5位直接入
        BigDecimal bigDiv2 = b1.divide(b2,4,BigDecimal.ROUND_UP);
        //精确到第4位,第5位直接舍
        BigDecimal bigDiv3 = b1.divide(b2,4,BigDecimal.ROUND_DOWN);
        System.out.println(bigDiv);
        System.out.println(bigDiv1);
        System.out.println(bigDiv2);
        System.out.println(bigDiv3);

输出结果


输出结果

相关文章

  • java——浮点数不精确的解决办法

    问题案例 由于计算机系统的特性,java浮点数(float、double)的精度有时候会不准确,案例代码如下: 输...

  • 3_浮点数的秘密

    关键词:内存中的浮点数、浮点数存储示例、十进制浮点数的内存表示、 float类型的不精确示例 1. 内存中的浮点数...

  • 个人代码库-待更新

    JS 浮点数相加不精确解决 浮点数取两位小数 css 内计算 input 按钮美化(input 上传框美化实例)

  • float为什么不能直接用==作比较

    本文尝试着将以下内容做一个浅显的解释,主要包括浮点数为什么是不精确的,浮点数为什么不能用==和!=直接比较,以及浮...

  • 浮点数运算结果不精确

    先来看代码 这里预计输出是0.1,但实际不是这样,下面是输出结果 出现这种结果是因为float与double类型主...

  • 浮点数为什么不精确?

    姓名:牛康 学号:17101223416 转载自:https://mp.weixin.qq.com/s?__biz...

  • 浮点数为什么不精确?

    最近在项目中遇到了浮点数相加结果显示异常的问题,如下图所示 理论上来说,d应该是等于0的,为什么结果和预期的不一样...

  • Python基础——数值类型与序列类型

    四种数值类型: 1.整形 int2.小数 浮点数 float 运算不精确3.布尔型 boo...

  • js浮点数的加减乘除解决方案

    序言 一直知道js的浮点数计算是不精确的, 0.1 + 0.2 !== 0.3,但是也就知道而已,解决方法却不怎么...

  • Awesome Java

    基础 Java 入门与实践 Java 语法清单 Java 8 系列之重新认识 HashMap Java 浮点数精确...

网友评论

    本文标题:java——浮点数不精确的解决办法

    本文链接:https://www.haomeiwen.com/subject/ouvshxtx.html