Java double的精度问题-BigDecimal的用法
2017-10-12 12:54
471 查看
很多程序员,尤其是没怎么经历过需要精确的小数运算的行业的程序员都会使用double来描述一个小数。
于是便出现了下面这个计算
public static void main(String[] args) { double priceA = 0.03;double priceB = 0.02;
System.out.println(priceA - priceB);}
这个算出来是多少。
肯定有很多人会说:”0.01呀,这还用问么?”。
然而真实运行出来的结果却是:
为什么是0.009999999999999998 而不是0.01
因为float和double都是浮点数, 都有取值范围, 都有精度范围. 浮点数与通常使用的小数不同, 使用中, 往往难以确定。
常见的问题是定义了一个浮点数, 经过一系列的计算, 它本来应该等于某个确定值, 但实际上并不是!
金额必须是完全精确的计算, 故不能使用double或者float, 而应该采用java.math.BigDecimal。
所以改成如下代码:
public static void main(String[] args) { BigDecimal priceA = BigDecimal.valueOf(0.03); BigDecimal priceB = BigDecimal.valueOf(0.02); System.out.println(priceA.subtract(priceB));}
运行出来的结果就对了。
以上代码运行出来的结果就是:
0.01
下面来介绍一下BigDecimal的基本运算方法
BigDecimal amountA = new BigDecimal(“199009”);
amountA = amountA.divide(new BigDecimal(100));//除以一百
BigDecimal.divide(BigDecimal);//除法
BigDecimal.multiply(BigDecimal);//乘法
BigDecimal.add(BigDecimal);//加法
BigDecimal.subtract(BigDecimal);//减法
BigDecimal.setScale(int);//精度
BigDecimal.setScal(int,BigDecimal.ROUND_DOWN);//直接删除多余的小数位,如2.35会变成2.3
BigDecimal.setScale(int,BigDecimal.ROUND_UP);//进位处理,2.35变成2.4
BigDecimal.setScale(int,BigDecimal.ROUND_HALF_UP);//四舍五入,2.35变成2.4
BigDecimal.setScaler(int,BigDecimal.ROUND_HALF_DOWN);//四舍五入,2.35变成2.3,如果是5则向下舍
于是便出现了下面这个计算
public static void main(String[] args) { double priceA = 0.03;double priceB = 0.02;
System.out.println(priceA - priceB);}
这个算出来是多少。
肯定有很多人会说:”0.01呀,这还用问么?”。
然而真实运行出来的结果却是:
为什么是0.009999999999999998 而不是0.01
因为float和double都是浮点数, 都有取值范围, 都有精度范围. 浮点数与通常使用的小数不同, 使用中, 往往难以确定。
常见的问题是定义了一个浮点数, 经过一系列的计算, 它本来应该等于某个确定值, 但实际上并不是!
金额必须是完全精确的计算, 故不能使用double或者float, 而应该采用java.math.BigDecimal。
所以改成如下代码:
public static void main(String[] args) { BigDecimal priceA = BigDecimal.valueOf(0.03); BigDecimal priceB = BigDecimal.valueOf(0.02); System.out.println(priceA.subtract(priceB));}
运行出来的结果就对了。
以上代码运行出来的结果就是:
0.01
下面来介绍一下BigDecimal的基本运算方法
BigDecimal amountA = new BigDecimal(“199009”);
amountA = amountA.divide(new BigDecimal(100));//除以一百
BigDecimal.divide(BigDecimal);//除法
BigDecimal.multiply(BigDecimal);//乘法
BigDecimal.add(BigDecimal);//加法
BigDecimal.subtract(BigDecimal);//减法
BigDecimal.setScale(int);//精度
BigDecimal.setScal(int,BigDecimal.ROUND_DOWN);//直接删除多余的小数位,如2.35会变成2.3
BigDecimal.setScale(int,BigDecimal.ROUND_UP);//进位处理,2.35变成2.4
BigDecimal.setScale(int,BigDecimal.ROUND_HALF_UP);//四舍五入,2.35变成2.4
BigDecimal.setScaler(int,BigDecimal.ROUND_HALF_DOWN);//四舍五入,2.35变成2.3,如果是5则向下舍
相关文章推荐
- Java浮点数float,bigdecimal和double精确计算的精度误差问题总结
- java.math.BigDecimal类的用法 解决double计算精度问题
- java.math.BigDecimal类的用法 解决double计算精度问题
- Java浮点数float,bigdecimal和double精确计算的精度误差问题总结
- java 解决double运算精度问题(使用BigDecimal )
- java 解决double运算精度问题(使用BigDecimal )
- Java中运算精度的问题(double与BigDecimal)
- java中四舍五入——double转BigDecimal的精度损失问题
- Java DOuble精度问题总结
- java解决double和float精度不准确的问题
- Double与BigDecimal 精度问题
- java的double的精度问题
- 关于java中Double类型的运算精度问题
- JAVA程序中Float和Double精度丢失问题
- 关于java中Double类型的运算精度问题
- Java Double 精度问题总结
- java的double的精度问题
- Java中double的精度问题
- 对java中double类型的精度问题探讨
- 第2章 Java编程基础——FAQ2.10 如何解决double和float精度不准的问题?