是另一个bigDecimal.toString()的BigDecimal总是等于?

时间:2015-10-28 01:12:13

标签: java

在Java中,新的BigDecimal来自另一个bigDecimal.toString()总是等于? 例如

    BigDecimal a = new BigDecimal("1.23");
    BigDecimal b = new BigDecimal(a.toString());

    System.out.println(a.compareTo(b) == 0); // always true?

我知道BigDecimal是不可变的,但我想知道是否有任何好方法来clone一个BigDecimal对象?

3 个答案:

答案 0 :(得分:17)

是的,你可以这样认为。来自BigDecimal.toString文档

  

如果该字符串表示转换回BigDecimal   使用BigDecimal(String)构造函数,然后使用原始值   将被收回。

但是,您可以安全地共享同一个对象,因为它是immutable并且不需要复制

答案 1 :(得分:2)

一种简单的方法是添加ZERO

BigDecimal a = new BigDecimal("1.23");
BigDecimal b = a.add(BigDecimal.ZERO);

答案 2 :(得分:0)

只是一句话:BigDecimal不是最终的,所以它可以通过一个可变类来扩展。因此,在某些用例中可能需要制作防御性副本。

可以使用BigDecimal.toString()方法:

 * There is a one-to-one mapping between the distinguishable
 * {@code BigDecimal} values and the result of this conversion.
 * That is, every distinguishable {@code BigDecimal} value
 * (unscaled value and scale) has a unique string representation
 * as a result of using {@code toString}.  If that string
 * representation is converted back to a {@code BigDecimal} using
 * the {@link #BigDecimal(String)} constructor, then the original
 * value will be recovered.

这里是制作BigDecimal防御性副本的代码示例:

public static BigDecimal safeInstance(BigDecimal val) { 
    return val.getClass() == BigDecimal.class ? 
    val : new BigDecimal(val.toString()); 
}

但它有意义吗?如果一个类扩展了BigDecimal类,你不能确定它不会在不尊重合同的情况下扩展其toString()方法......

使BigDecimal的任何扩展名无效可能更好:

public static BigDecimal safeInstance(BigDecimal val) { 
    if (val.getClass() != BigDecimal.class) {
        //TODO throw exception
    }
    return val; 
}