JR 精品文章 - 精确计算。。。Double
AD: jr (at) javaresearch.org


首页 | 动态 | 文章 | FAQ  | 新闻 | 下载 | 代码 | 工作 | 调查 | 术语 | 站点 | 图书 | 论坛 | 帮助 | 全部  

TOP | 交流 | 软件 | 专栏 | 开源 | 译/著 | 源码 | API  | 推荐 | FTP  | 积分 | 统计 | 搜索 | Blog | 我们  
首页 » 研究文集 » J2EE综合 评论此文章 发表评论     开始监控此文章 开始监控   加入收藏夹  加入收藏夹
精确计算。。。Double
longxx888 原创   更新:2008-03-29 19:33:35  版本: 1.0   

大家在用double型计算的时候有没碰到如下问题:
   double d1=1000d;  double d2=1.017d;
   double d3=d1*d2;  d3的结果是:1016.99999999
然后再把这个数据再乘以个double d4=18750d;再除以100000;
结果为:19.0687499998125 如果四舍五入保留四位小数结果为:19.0687
而真真用计算器或用系统自带的计算器算出来结果为:19.0685,这样结果相差0.0001
似乎看起来相差的不是很大,如这个结果乘以个数量可想而之会差的很大的。以下是本人专门写了个类的解决些问题,给用得着的人提供快捷的路:

import java.math.BigDecimal;

/**
 * Double的加减乘除
 * @author xuxinlong
 * E-mail:longxx888@163.com
 */
public class NumberOP {
    private BigDecimal ins;
    
    /**
     * 测试
     * @param args
     */
    public static void main(String[] args){
        System.out.println(new NumberOP(18750).mul(new NumberOP(1.017)).mul(new NumberOP(1000)).div(new NumberOP(1000000)).toDouble());
    }
    
    /**
     * 从NumberOP构建一个NumberOP
     * @param numberOP
     */
    public  NumberOP(NumberOP numberOP){
        this.ins = numberOP.ins;
    }
    
    /**
     *  从BigDecimal构建一个NumberOP
     * @param bigDecimalValue
     */
    public  NumberOP(BigDecimal bigDecimalValue){
        this.ins = bigDecimalValue;
    }
    
    
    /**
     * 从String构建一个NumberOP
     * @param doubleValue
     */
    public  NumberOP(String doubleValue){
        this.ins = new BigDecimal(doubleValue);
    }

    /**
     * 从int构建一个NumberOP
     * @param intValue
     */
    public  NumberOP(int intValue){
        this.ins = new BigDecimal(Integer.toString(intValue));
    }
    
    /**
     * 从long构建一个NumberOP
     * @param longValue
     */
    public  NumberOP(long longValue){
        this.ins = new BigDecimal(Long.toString(longValue));
    }
    
    /**
     * 从float构建一个NumberOP
     * @param floatValue
     */
    public  NumberOP(float floatValue){
        this.ins = new BigDecimal(Float.toString(floatValue));
    }
    
    
    
    /**
     * 从double构建一个NumberOP
     * @param doubleValue
     */
    public  NumberOP(double doubleValue){
        this.ins = new BigDecimal(Double.toString(doubleValue));
    }
    
    
    
     /**
     * 两个数相加
     * @param v1
     * @param v2
     * @return NumberOP
     */
    public NumberOP add(NumberOP v1){
       return new NumberOP(this.ins.add(v1.ins));
    }
    
    
    
    /**
     * 两个数相减
     * @param v1
     * @param v2
     * @return Double
     */
    public NumberOP sub(NumberOP v1){
        return new NumberOP(this.ins.subtract(v1.ins));
    }
    
    /**
     * 两个数相乘
     * @param v1
     * @param v2
     * @return Double
     */
    public NumberOP mul(NumberOP v1){
        return new NumberOP(this.ins.multiply(v1.ins));
    }
    
    /**
     * 两个数相除
     * @param v1
     * @param v2
     * @return Double
     */
    public NumberOP div(NumberOP v1){
        return new NumberOP(this.ins.divide(v1.ins,10,BigDecimal.ROUND_HALF_UP));
    }
    
    /**
     * 返回String的结果
     * @param numberOP
     * @return
     */
    public String toString(){
        return this.ins.toString();
    }
    
    /**
     * 返回double的结果
     * @param numberOP
     * @return
     */
    public double toDouble(){
        return this.ins.doubleValue();
    }
}

版权声明   给作者写信
本篇文章对您是否有帮助?  投票:         投票结果:     10       0
作者其它文章: 作者全部文章
评论人:longxx888 发表时间: Sat Mar 29 19:40:58 CST 2008
[shine] 发表的文章怎么修改内容啊??????不好意思,内容有一处错误更改为:
而真真用计算器或用系统自带的计算器算出来结果为:19.0688,这样结果相差0.0001
评论人:lzllcjfe 发表时间: Sun Mar 30 12:01:33 CST 2008
似的似的个士大夫个似的核黄素豆腐干后
评论人:championcgh 发表时间: Mon Mar 31 11:06:52 CST 2008
值得学一下哦
评论人:kingzgh 发表时间: Wed Apr 02 16:33:26 CST 2008
学习中..............
评论人:laonongfu 发表时间: Mon Apr 14 21:16:57 CST 2008
[:D][good]
评论人:laonongfu 发表时间: Mon Apr 14 21:17:29 CST 2008
[:D][good]

这个文章共有 6 条评论
主题: J2EE全面介绍(二) 上一篇文章
返回文章列表 返回〔J2EE综合〕
下一篇文章 主题: [b]Java程序员认证模拟题及详细分析[/b]


文字广告链接
        自主、快速定制基于JAVA的B/S业务系统          重量级企业在线自定义WEB报表平台
        Excel制表、零代码发布、打印、图表结合——快逸报表,免费、稳定、功能强大的java工具
        技术圈: 关于Java、dotNet、PHP、Ruby、奇客、Web2.0等更多资讯博客精选文章

关于 JR  |  版权声明  |  联系我们 

©2002-2006 JR 版权所有 沪ICP备05019622号