Java float的精度问题

1、问题描述
进行计算器项目时,对于小数的减法出现了精度问题。之前float的精度问题是有了解的,现在既然在运用中出现了,那就把解决掉吧。当我们输入2.2 - 2.0时,得到的结果会是0.20000005,这肯定是我们不希望看到的。

2、问题分析
为什么会出现这样的情况了?
具体的我也解释不清楚,一个可能的原因是和计算机中存储float类型的方式有关吧。好比我们要去求1/3的结果一样,只可能得到一个近似值。 
我参考的文章中提到了一个解决方法,通过BigDecimal 类;通过百度后,知道它是用来进行 大数字操作的类,而且可以解决浮点数精度的问题。同时还有一个处理整数的BinInteger类。详细说明读者可以进一步阅读:

3、具体的代码

//之前的计算形式
float a = 2.2f;
float b = 2.0f;
float c = a - b;

//改变成以下的写法
BigDecimal a1 = new BigDecimal(Float.toString(a));
BigDecimal b1 = new BigDecimal(Float.toString(b));
float c1 = a1.subtract(b1).floatValue();

以下代码转载自:http://blog.sina.com.cn/s/blog_6a0cd5e501011soa.html


</pre><pre name="code" class="java">
package org.lxh.demo11.numberdemo;
import java.math.BigDecimal;
class MyMath {
    public static double add(double d1, double d2)
{        // 进行加法运算
         BigDecimal b1 = new BigDecimal(d1);
         BigDecimal b2 = new BigDecimal(d2);
        return b1.add(b2).doubleValue();
     }
    public static double sub(double d1, double d2)
{        // 进行减法运算
         BigDecimal b1 = new BigDecimal(d1);
         BigDecimal b2 = new BigDecimal(d2);
        return b1.subtract(b2).doubleValue();
     }
    public static double mul(double d1, double d2)
{        // 进行乘法运算
         BigDecimal b1 = new BigDecimal(d1);
         BigDecimal b2 = new BigDecimal(d2);
        return b1.multiply(b2).doubleValue();
     }
    public static double div(double d1,
double d2,int len) {// 进行除法运算
         BigDecimal b1 = new BigDecimal(d1);
         BigDecimal b2 = new BigDecimal(d2);
        return b1.divide(b2,len,BigDecimal.
ROUND_HALF_UP).doubleValue();
     }
    public static double round(double d,
int len) {     // 进行四舍五入
操作
         BigDecimal b1 = new BigDecimal(d);
         BigDecimal b2 = new BigDecimal(1);
        // 任何一个数字除以1都是原数字
        // ROUND_HALF_UP是BigDecimal的一个常量,
表示进行四舍五入的操作
        return b1.divide(b2, len,BigDecimal.
ROUND_HALF_UP).doubleValue();
     }
}
public class BigDecimalDemo01 {
    public static void main(String[] args) {
         System.out.println("加法运算:" +
MyMath.round(MyMath.add(10.345,
3.333), 1));
         System.out.println("乘法运算:" +
MyMath.round(MyMath.mul(10.345,
3.333), 3));
         System.out.println("除法运算:" +
MyMath.div(10.345, 3.333, 3));
         System.out.println("减法运算:" +
MyMath.round(MyMath.sub(10.345,
3.333), 3));
     }
}


 
 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值