BigDecimal使用字符串和(int,long,double)构造函数舍入差异

时间:2015-01-21 10:13:16

标签: java rounding bigdecimal

使用舍入时在bigdecimal中使用不同的构造函数有什么区别。运行以下代码时:

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四舍五入时是否还有其他差异?

1 个答案:

答案 0 :(得分:3)

  

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

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

您可以使用BigDecimal.valueOf(double)创建有效解析BigDecimal值的规范字符串表示的double值 - 然后您将获得相同的结果至于String