浮点数在计算机中间采用的表示方式是基于 IEEE 754 的标准,这种标准对于非规约形式的浮点数进行舍入运算。这样可能导致某些小数的运算可能会失真,不精确。但对于金融或货币计算时,应尽可能避免精度丢失。
避免精度丢失的方式:
1 BigDecimal 类
BigDecimal 类提供了精确的小数运算。
package com.wanmait; import java.math.BigDecimal; public class Main { public static void main(String[] args) { BigDecimal number1 = new BigDecimal("1.00"); BigDecimal number2 = new BigDecimal("3.00"); //+ BigDecimal result1 = number1.add(number2); System.out.println(result1); //- BigDecimal result2 = number1.subtract(number2); System.out.println(result2); //* BigDecimal result3 = number1.multiply(number2); System.out.println(result3); // /divide(除数,小数点之后位数,四舍五入模式) BigDecimal result4 = number1.divide(number2,3,BigDecimal.ROUND_HALF_UP); System.out.println(result4); } }
2 指定精度和四射突入
BigDecimal 类指定精度和输入模式
package com.wanmait; import java.math.BigDecimal; public class Main { public static void main(String[] args) { BigDecimal number1 = new BigDecimal("1.00").setScale(2, BigDecimal.ROUND_HALF_UP); } }
3 转换成整数运算
package com.wanmait; public class Main { public static void main(String[] args) { double a = 1.00; double b = 3.00; int na = (int)(a*100); int nb = (int)(b*100); double c = (na+nb)/100.0; System.out.println(c); } }
4 比较小数是否相同,采用小的容差值
以下代码的执行结果为 false
package com.wanmait; import java.math.BigDecimal; public class Main { public static void main(String[] args) { double a = 0.1+0.2; double b = 0.3; System.out.println(a==b); } }
小数失真引起的:
设定容差值,两个数的差的绝对值小于容差值就表示两个数相同
package com.wanmait; public class Main { public static void main(String[] args) { double a = 0.1+0.2; double b = 0.3; //容差值 double min = 1e-10;//10的-10次方 if(Math.abs(a-b)<min) { System.out.println(true); } else { System.out.println(false); } } }
0条评论
点击登录参与评论