2015-01-21 147 views
0

使用舍入时使用不同构造函数的bigdecimal有什么区别?当运行下面的代码:BigDecimal使用字符串和(int,long,double)构造函数进行舍入差异

public class RoundTest { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) {//2.425 
     BigDecimal intv = new BigDecimal(4.645); 
     BigDecimal doublev = new BigDecimal(4.645); 
     BigDecimal strV = new BigDecimal("4.645"); 
     BigDecimal longV = new BigDecimal(4.645); 

     System.out.println("Int - "+intv.setScale(2, RoundingMode.HALF_UP)); 
     System.out.println("Int - "+intv.setScale(2, RoundingMode.HALF_DOWN)); 
     System.out.println("Int - "+intv.setScale(2, RoundingMode.HALF_EVEN)); 

     System.out.println("Double -"+doublev.setScale(2, RoundingMode.HALF_UP)); 
     System.out.println("Double -"+doublev.setScale(2, RoundingMode.HALF_DOWN)); 
     System.out.println("Double -"+doublev.setScale(2, RoundingMode.HALF_EVEN)); 

     System.out.println("String - "+strV.setScale(2, RoundingMode.HALF_UP)); 
     System.out.println("String - "+strV.setScale(2, RoundingMode.HALF_DOWN)); 
     System.out.println("String - "+strV.setScale(2, RoundingMode.HALF_EVEN)); 

     System.out.println("Long - "+longV.setScale(2, RoundingMode.HALF_UP)); 
     System.out.println("Long - "+longV.setScale(2, RoundingMode.HALF_DOWN)); 
     System.out.println("Long - "+longV.setScale(2, RoundingMode.HALF_EVEN)); 
    } 
} 

输出是:

Int - 4.64 
Int - 4.64 
Int - 4.64 
Double -4.64 
Double -4.64 
Double -4.64 
**String - 4.65** 
String - 4.64 
String - 4.64 
Long - 4.64 
Long - 4.64 
Long - 4.64 

为什么四舍五入使用字符串构造给出不同的结果比其他人呢?在使用BigDecimal四舍五入时是否还有其他差异?

+0

不清楚为什么你有'intv'和'longv' - 它们与'doublev'完全一样,因为你在所有情况下调用'BigDecimal(double)'构造函数。 – 2015-01-21 10:23:20

回答

3

为什么使用字符串构造函数进行舍入的结果与其他结果不同?

因为它是你实际上传递恰好4.645一个价值的唯一时间。剩下的时间,你通过的double值接近于4.645,这不是实际上是 4.645 - 它是4.644999999999999573674358543939888477325439453125。

您可以使用BigDecimal.valueOf(double)创建BigDecimal值有效地解析double价值规范的字符串表示,而不是 - 然后你会得到相同的结果为String