gpt4 book ai didi

java - BigDecimal - 使用 new 或 valueOf

转载 作者:IT老高 更新时间:2023-10-28 11:40:00 26 4
gpt4 key购买 nike

我遇到了两种从双 d 中获取 BigDecimal 对象的方法。

  1. new BigDecimal(d)
  2. BigDecimal.valueOf(d)

哪种方法更好? valueOf 会创建一个新对象吗?

一般情况下(不仅仅是 BigDecimal),推荐什么 - new 或 valueOf?

最佳答案

这是两个独立的问题:“我应该为 BigDecimal 使用什么?”和“我一般会做什么?”

对于 BigDecimal:这有点棘手,因为它们不做同样的事情BigDecimal.valueOf(double)将使用 canonical String representation传入的 double 值用于实例化 BigDecimal 对象。换句话说:BigDecimal 对象的值将是您在执行 System.out.println(d) 时看到的值。

如果您使用 new BigDecimal(d)但是,BigDecimal 将尝试尽可能准确地表示 double 值。这通常会导致存储的数字比您想要的多得多。严格来说,它比 valueOf() 更正确,但直观性差很多。

JavaDoc 中有一个很好的解释:

The results of this constructor can be somewhat unpredictable. One might assume that writing new BigDecimal(0.1) in Java creates a BigDecimal which is exactly equal to 0.1 (an unscaled value of 1, with a scale of 1), but it is actually equal to 0.1000000000000000055511151231257827021181583404541015625. This is because 0.1 cannot be represented exactly as a double (or, for that matter, as a binary fraction of any finite length). Thus, the value that is being passed in to the constructor is not exactly equal to 0.1, appearances notwithstanding.

一般来说,如果结果相同(即不是在BigDecimal的情况下,而是在大多数其他情况下),那么valueOf() 应该是首选:它可以缓存常用值(如 Integer.valueOf() 所示),它甚至可以更改缓存行为而无需更改调用者。 newalways 实例化一个新值,即使没有必要(最好的例子:new Boolean(true) vs. Boolean.valueOf (真))。

关于java - BigDecimal - 使用 new 或 valueOf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7186204/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com