Java float的精度问题

来源:互联网 发布:excel的数据分析工具 编辑:程序博客网 时间:2024/05/14 13:41
1、问题描述
进行计算器项目时,对于小数的减法出现了精度问题。之前float的精度问题是有了解的,现在既然在运用中出现了,那就把解决掉吧。当我们输入2.2 - 2.0时,得到的结果会是0.20000005,这肯定是我们不希望看到的。

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

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
原创粉丝点击