【问题标题】:is new a BigDecimal from another bigDecimal.toString() always equals?来自另一个 bigDecimal.toString() 的新 BigDecimal 是否总是等于?
【发布时间】:2015-10-28 01:12:13
【问题描述】:

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

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

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

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

【问题讨论】:

  • @CrakC 你能举一个浅拷贝的例子吗?
  • @andyf 我不这么认为。我无法保证返回一个新对象。
  • @andyf 我刚刚检查过,BigDecimal.ZERO.add(BigDecimal.ZERO) 没有返回新对象。
  • @SotiriosDelimanolis 是的,它不需要一个,因为它是不可变的
  • @PaulBoddington 谢谢。是的 BigDecimal.ZERO.add(BigDecimal.ZERO) 不返回新对象。可能是因为结果也是 BigDecimal.ZERO 。但是当我尝试其他 NOT ZERO 值时,返回一个新对象。

标签: java


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    一种简单的方法是添加零

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

    【讨论】:

    • add 方法可能会返回相同的对象。不能保证 add 方法返回另一个对象。
    • 我查看了 BigDecimal.class,它似乎总是返回一个新的 BigDecimal
    【解决方案3】:

    请注意: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; 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2016-06-09
      • 2019-12-13
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多