为什么浮点数会有精度丢失的风险?
计算机用二进制表示数字时,宽度是有限的。浮点数转换为二进制时会出现无限循环的情况,因此只能被截断。这也就是解释了为什么浮点数没有办法用二进制精确表示。
浮点数之间的等值判断
由于计算机表示浮点数时会有精度丢失的风险,因此浮点数之间的等值判断,基本数据类型不能用 == 来比较,包装数据类型不能用 equals 来判断。而是通过判断其差的绝对值小于某个值,就判定相等。
BigDecimal能准确表示浮点数?
BigDecimal类型使用BigInteger来保存浮点数的值,long型scale表示其小数位,因此BigDecimal
可以实现对浮点数的运算,不会造成精度丢失。
BigDecimal常见方法
1. 为了防止精度丢失,使用BigDecimal(String val)
构造方法或者 BigDecimal.valueOf(double val)
静态方法来创建对象。
BigDecimal a = new BigDecimal("1.0");
BigDecimal b = BigDecimal.valueOf(0.1);
2. BigDecimal
对象进行加减乘除操作有其对应的函数
3. BigDecimal
对象等值比较应该使用compareTo()方法,而不是equals()方法。因为 equals()
方法不仅仅会比较值的大小(value)还会比较精度(scale),而 compareTo()
方法比较的时候会忽略精度。