跟进BigDecimal new或valueof

时间:2014-01-03 18:04:52

标签: java bigdecimal

这个问题是问题(BigDecimal - to use new or valueOf)的后续问题及其接受的答案。

为方便起见重申问题和答案:

BigDecimal有两种方法:

double d = 0.1;
BigDecimal bd1 = new BigDecimal(d);
BigDecimal bd2 = BigDecimal.valueOf(d);

哪一个更好?答案显示这些方法不会产生相同的结果:

System.out.println(bd1);
System.out.println(bd2);

显示:

0.1000000000000000055511151231257827021181583404541015625
0.1

答案中,回答者说:

  

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

我的问题是:我们能否得到一些实际的例子,具体说明我们应该何时使用BigDecimal.valueOf()以及什么时候应该使用new BigDecimal()?回答者说“如果结果相同,则使用valueOf()”但这对BigDecimal无法帮助我们知道何时使用它(如果有的话?)。

具体而言,这是更可取的:

0.1000000000000000055511151231257827021181583404541015625

0.1

?为什么?

2 个答案:

答案 0 :(得分:10)

首先,每当你从double转换为BigDecimal时,你都应该退后一步,问问自己,你是否真的在做正确的事情。例如,如果您通过从String解析到double来完成此操作,那么您应该直接从String转到BigDecimal。我一般都对这种转换持谨慎态度,因为它通常表明有人在其他地方使用了不合适的类型。

除此之外,他们做了不同的事情:构造函数给出BigDecimal,表示与double完全相同的数字; valueOf给出BigDecimal,表示double值的规范字符串表示形式给出的数字。它们只是不同的东西,当你尝试使用它时,你应该知道你想要哪一个。

鉴于我会尽量避免陷入这种情况,但很难举例说明每种情况何时更合适,但如果你不可避免地将文本转换为{{ 1}},然后丢失原始文本,但想要回到该值,然后使用double 可能来为您提供更好的结果。如果您对valueOf值执行了大量算术运算,那么构造函数可能更合适。但它确实非常符合上下文,正如我在大多数情况下所说的那样,我可能会选择重新设计,而不是选择任何一种选择。

答案 1 :(得分:-1)

查看BigDecimal的来源,很明显将double传递给valueOf比调用构造函数效率低