当前位置: 首页 > 后端技术 > Java

为什么建议大家使用BigDecimal进行浮点计算?

时间:2023-04-01 13:21:53 Java

封面图大家好,我是阿壮,一名在互联网上挣扎求生的程序员。今天和大家分享一下开发中遇到的浮点计算如何处理?为什么0.1+0.2!=0.3?先来看一段奇怪的代码。浮点数的编码方式。首先我们要知道在计算机世界里为什么0.1+0.2不等于0.3。你可以自己试试。这就涉及到浮点数的编码方式。其中的存储方式遵循IEEE754浮点数计数标准,可以表示为尾数+指数码的编码方式。一旦确定了符号(S)、指数代码部分(E)和尾数部分(M),就可以确定一个。漂浮。Signpart(S)0-positive1-negativecodepart(E)(exponentpart):对于float类型的浮点数,指数部分是8位,考虑到它可以是正的也可以是负的,所以可以取的指数范围表示的是-127~128对于double型浮点数,指数部分有11位,可以是正数也可以是负数,所以可以表示的指数范围是-1023~1024尾数部分(M):精度浮点数的位数由尾数的位数决定:对于float类型的浮点数,尾数部分为23位,换算成十进制为2^23=8388608,所以小数精度只有6~7位;对于double类型的浮点数,尾数部分是52位,换算成十进制是2^52=4503599627370496,所以十进制精度只有15到16位,所以浮点数在计算机中存储时可能会出现精度损失。记住float的精度上限是6~7位,double的精度上限是15~16位。浮点十进制如何转二进制,比如0.875如何转二进制?将浮点数拆分为整数部分和带小数点的小数部分。使用整数部分:除以2并取余数。如果为0,则不需要对小数部分进行运算。用途:乘以2并向上取整。合并结果计算过程如下:整数部分+小数部分最终得到二进制结果0.111。下面是0.1和0.2的二进制表示。0.1的二进制表示是0.0001100110011001...(死循环)0.2的二进制表示是0.0011001100110011...(死循环)此时我们知道我们看到的是0.1并不是真的0.1,同时,计算出来的结果是无限的和非循环的。原来计算机不能准确表示0.1、0.2等浮点数,在计算时使用了有舍入误差的数,造成浮点数在基数转换时的精度损失。推荐使用BigDecimal,因为浮点数会丢失精度,而在实际业务中,往往需要精确到小数点后几位进行计算,尤其是支付类产品,通常精确到美分,这时候我们就可以使用Java了。BigDecimal类型,使用BigDecimal定义浮点数的值,然后进行浮点运算,以下是BigDecimal的几个用法示例//SubtractionBigDecimala=newBigDecimal("1.0");BigDecimalb=newBigDecimal("0.9");BigDecimalc=newBigDecimal("0.8");BigDecimalx=a.subtract(b);BigDecimaly=b.subtract(c);//比较大小BigDecimala=newBigDecimal(“1.0”);BigDecimalb=newBigDecimal("0.9");System.out.println(a.compareTo(b));//保留小数位BigDecimalm=newBigDecimal("1.255433");BigDecimaln=m.setScale(3,BigDecimal.ROUND_HALF_DOWN);System.out.println(n);//除法取余BigDecimaln=newBigDecimal("12.345");BigDecimalm=newBigDecimal("0.12");BigDecimal[]dr=n.divideAndRemainder(m);System.out.println(博士[0]);//102System.out.println(博士[1]);//0.105使用BigDecimal注意事项《阿里巴巴 Java 开发手册》我是阿壮,微信搜索一搜:科技猫,获取第一时间更新,下期见