在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对象?
答案 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;
}