??xml version="1.0" encoding="utf-8" standalone="yes"?>国产午夜亚洲精品不卡免下载 ,亚洲av成人无码久久精品,亚洲福利电影一区二区?http://m.tkk7.com/jamespace/category/20469.html技术不是学出来的,而是ȝ出来?/description>zh-cnWed, 28 May 2008 19:44:13 GMTWed, 28 May 2008 19:44:13 GMT60new和newInstance()区别(转蝲补充)http://m.tkk7.com/jamespace/archive/2008/05/28/newInstance.html心中?/dc:creator>心中?/author>Wed, 28 May 2008 13:29:00 GMThttp://m.tkk7.com/jamespace/archive/2008/05/28/newInstance.htmlhttp://m.tkk7.com/jamespace/comments/203638.htmlhttp://m.tkk7.com/jamespace/archive/2008/05/28/newInstance.html#Feedback0http://m.tkk7.com/jamespace/comments/commentRss/203638.htmlhttp://m.tkk7.com/jamespace/services/trackbacks/203638.html阅读全文

]]>
java.math.BigDecimal的用法?Q{载)http://m.tkk7.com/jamespace/archive/2007/12/19/BigDecimal.html心中?/dc:creator>心中?/author>Wed, 19 Dec 2007 06:40:00 GMThttp://m.tkk7.com/jamespace/archive/2007/12/19/BigDecimal.htmlhttp://m.tkk7.com/jamespace/comments/168747.htmlhttp://m.tkk7.com/jamespace/archive/2007/12/19/BigDecimal.html#Feedback0http://m.tkk7.com/jamespace/comments/commentRss/168747.htmlhttp://m.tkk7.com/jamespace/services/trackbacks/168747.html 关键?nbsp;    Java 点?nbsp;_计算   

问题的提出:
如果我们~译q行下面q个E序会看C么?
public class Test{
    public static void main(String args[]){
        System.out.println(0.05+0.01);
        System.out.println(1.0-0.42);
        System.out.println(4.015*100);
        System.out.println(123.3/100);
    }
};
你没有看错!l果实?br /> 0.060000000000000005
0.5800000000000001
401.49999999999994
1.2329999999999999
Java中的单QҎcdfloat和double不能够进行运。不光是JavaQ在其它很多~程语言中也有这L问题。在大多数情况下Q计的l果是准的Q但是多试几ơ(可以做一个@环)可以试出类g面的错误。现在终于理解ؓ什么要有BCD码了?br /> q个问题相当严重Q如果你?.999999999999元,你的计算机是不会认ؓ你可以购?0元的商品的?br /> 在有的编E语a中提供了专门的货币类型来处理q种情况Q但是Java没有。现在让我们看看如何解决q个问题?br />  
四舍五入
我们的第一个反应是做四舍五入。MathcM的roundҎ不能讄保留几位数Q我们只能象q样Q保留两位)Q?br /> public double round(double value){
    return Math.round(value*100)/100.0;
}
非常不幸Q上面的代码q不能正常工作,l这个方法传?.015它将q回4.01而不?.02Q如我们在上面看到的
4.015*100=401.49999999999994
因此如果我们要做到精的四舍五入Q不能利用简单类型做Mq算
java.text.DecimalFormat也不能解册个问题:
System.out.println(new java.text.DecimalFormat("0.00").format(4.025));
输出?.02
 
BigDecimal
在《Effective Java》这本书中也提到q个原则Qfloat和double只能用来做科学计或者是工程计算Q在商业计算中我们要用java.math.BigDecimal。BigDecimal一共有4个够造方法,我们不关心用BigInteger来够造的那两个,那么q有两个Q它们是Q?br /> BigDecimal(double val) 
          Translates a double into a BigDecimal. 
BigDecimal(String val) 
          Translates the String repre sentation of a BigDecimal into a BigDecimal.
上面的API要描q相当的明确Q而且通常情况下,上面的那一个用v来要方便一些。我们可能想都不惛_用上了,会有什么问题呢Q等到出了问题的时候,才发C面哪个够造方法的详细说明中有q么一D:
Note: the results of this constructor can be somewhat unpredictable. One might assume that new BigDecimal(.1) is exactly equal to .1, but it is actually equal to .1000000000000000055511151231257827021181583404541015625. This is so because .1 cannot be represented exactly as a double (or, for that matter, as a binary fraction of any finite length). Thus, the long value that is being passed in to the constructor is not exactly equal to .1, appearances nonwithstanding. 
The (String) constructor, on the other hand, is perfectly predictable: new BigDecimal(".1") is exactly equal to .1, as one would expect. Therefore, it is generally recommended that the (String) constructor be used in preference to this one.
原来我们如果需要精计,非要用String来够造BigDecimal不可Q在《Effective Java》一书中的例子是用String来够造BigDecimal的,但是书上却没有强调这一点,q也许是一个小的p吧?br />  
解决Ҏ
现在我们已经可以解决q个问题了,原则是用BigDecimalq且一定要用String来够造?br /> 但是惛_一下吧Q如果我们要做一个加法运,需要先两个QҎ转ؓStringQ然后够造成BigDecimalQ在其中一个上调用addҎQ传入另一个作为参敎ͼ然后把运的l果QBigDecimalQ再转换为QҎ。你能够忍受q么烦琐的过E吗Q下面我们提供一个工LArith来简化操作。它提供以下静态方法,包括加减乘除和四舍五入:
public static double add(double v1,double v2)
public static double sub(double v1,double v2)
public static double mul(double v1,double v2)
public static double div(double v1,double v2)
public static double div(double v1,double v2,int scale)
public static double round(double v,int scale)
附录
源文件Arith.javaQ?br /> import java.math.BigDecimal;
/**
 * ׃Java的简单类型不能够_的对点数进行运,q个工具cL供精
 * 的点数运,包括加减乘除和四舍五入?br />  */
public class Arith{
    //默认除法q算_ֺ
    private static final int DEF_DIV_SCALE = 10;
    //q个cM能实例化
    private Arith(){
    }
 
    /**
     * 提供_的加法运?br />      * @param v1 被加?br />      * @param v2 加数
     * @return 两个参数的和
     */
    public static double add(double v1,double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.add(b2).doubleValue();
    }
    /**
     * 提供_的减法运?br />      * @param v1 被减?br />      * @param v2 减数
     * @return 两个参数的差
     */
    public static double sub(double v1,double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.subtract(b2).doubleValue();
    } 
    /**
     * 提供_的乘法运?br />      * @param v1 被乘?br />      * @param v2 乘数
     * @return 两个参数的积
     */
    public static double mul(double v1,double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.multiply(b2).doubleValue();
    }
 
    /**
     * 提供Q相对)_的除法运,当发生除不尽的情冉|Q精到
     * 数点以?0位,以后的数字四舍五入?br />      * @param v1 被除?br />      * @param v2 除数
     * @return 两个参数的商
     */
    public static double div(double v1,double v2){
        return div(v1,v2,DEF_DIV_SCALE);
    }
 
    /**
     * 提供Q相对)_的除法运。当发生除不的情况Ӟ由scale参数?br />      * 定精度,以后的数字四舍五入?br />      * @param v1 被除?br />      * @param v2 除数
     * @param scale 表示表示需要精到数点以后几位?br />      * @return 两个参数的商
     */
    public static double div(double v1,double v2,int scale){
        if(scale<0){
            throw new IllegalArgumentException(
                "The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
 
    /**
     * 提供_的小C四舍五入处理?br />      * @param v 需要四舍五入的数字
     * @param scale 数点后保留几位
     * @return 四舍五入后的l果
     */
    public static double round(double v,int scale){
        if(scale<0){
            throw new IllegalArgumentException(
                "The scale must be a positive integer or zero");
        }
        BigDecimal b = new BigDecimal(Double.toString(v));
        BigDecimal one = new BigDecimal("1");
        return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
};


]]>
J2SE知识易错Ҏȝ(一)http://m.tkk7.com/jamespace/archive/2007/03/24/J2SE.html心中?/dc:creator>心中?/author>Sat, 24 Mar 2007 07:50:00 GMThttp://m.tkk7.com/jamespace/archive/2007/03/24/J2SE.html  阅读全文

]]>
վ֩ģ壺 Ƶ| ѹۿƵ| һ| ޹˳ɾƷ| ˳ɵӰվƷ| vƬƵ߹ۿƵ| ֻˬִַ̼ | 99þó˹Ʒ| һƵѹۿ| һһͰһƵ| Ůվ| 99þþù| ĻƵ߹ۿ| Ƭѿ| þþþþþõѲ| 57paoƵѲ| ˾Ƶ| õ998Ƶѹۿ| aëƬվ| ѿһëƬ| ȫԼƵ| һ߲| þþƷ鶹| ޾Ļ| һ߹ۿվ| Ʒרţţ| žѹۿȫƵ| va߹ۿ| ҹƬ߲| 椸ѹۿƵ| Ұһ| ޾þþþþAV| ޵һĻ| ĻƷ| ޾ƷѿӰԺ| պAVһ| ӾƷӹۿƬ| ڵƵ| 3pһ| ӰԺ߲| ޺ݺۺϾþѿ|