| 精确计算。。。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(); } }
|
|
|
评论人:longxx888
|
发表时间: Sat Mar 29 19:40:58 CST 2008
|
发表的文章怎么修改内容啊??????不好意思,内容有一处错误更改为: 而真真用计算器或用系统自带的计算器算出来结果为: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]](/faces/28.gif)
|
|
|
评论人:laonongfu
|
发表时间: Mon Apr 14 21:17:29 CST 2008
|
![[:D]](/faces/28.gif)
|
|
|