`

如何解决double和float精度不准的问题?

UP 
阅读更多

float和double型,的底层实现是二进制的。十进制中的一个有限位数小数,转换成二进制就不一定是有限位数了,一旦位数超过的float和double型的位数宽度,就会出现“精度溢出”。所以float和double型是为了科学计算而设计的,并不适合精确的十进制计算.

就像一个十进制的小数,要不断地乘以2取整,但在这个过程中可能会一直循环下去,这就造成了数据的不精确。

所以在必须要求数据的精确度时,不能使用float和double.

public class Test{

public static void main(String[] args)

{

System.out.println(0.05+0.01);

System.out.println(1.0-0.42);

System.out.println(4.015*100);

System.out.println(123.3/100);

}

}

输出结果为:

0.060000000000000005

0.5800000000000001

401.49999999999994

1.2329999999999999

BigDecimal类可解决计算精度问题可使用BigDecimal类创建一个封装类。封装加减乘除操作

例:对一个小数进行指定位数的四舍五入:

BigDecimal bd = new BigDecimal("0.9851095");

BigDecimal one = new BigDecimal("1");

System.out.println(bd.divide(one, 3, BigDecimal.ROUND_HALF_UP));

BigDecimal中还有很多相关的数值之间的计算方法,以及精确到的位数和四舍五入等

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics