这个问题是问题(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
?为什么?
答案 0 :(得分:10)
首先,每当你从double
转换为BigDecimal
时,你都应该退后一步,问问自己,你是否真的在做正确的事情。例如,如果您通过从String
解析到double
来完成此操作,那么您应该直接从String
转到BigDecimal
。我一般都对这种转换持谨慎态度,因为它通常表明有人在其他地方使用了不合适的类型。
除此之外,他们做了不同的事情:构造函数给出BigDecimal
,表示与double
完全相同的数字; valueOf
给出BigDecimal
,表示double
值的规范字符串表示形式给出的数字。它们只是不同的东西,当你尝试使用它时,你应该知道你想要哪一个。
鉴于我会尽量避免陷入这种情况,但很难举例说明每种情况何时更合适,但如果你不可避免地将文本转换为{{ 1}},然后丢失原始文本,但想要回到该值,然后使用double
可能来为您提供更好的结果。如果您对valueOf
值执行了大量算术运算,那么构造函数可能更合适。但它确实非常符合上下文,正如我在大多数情况下所说的那样,我可能会选择重新设计,而不是选择任何一种选择。
答案 1 :(得分:-1)
查看BigDecimal的来源,很明显将double传递给valueOf比调用构造函数效率低