跟进BigDecimal new或valueof

ryv*_*age 2 java bigdecimal

这个问题是对问题的跟进(BigDecimal - 使用new或valueOf)及其接受的答案.

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

BigDecimal 有两种方法:

double d = 0.1;
BigDecimal bd1 = new BigDecimal(d);
BigDecimal bd2 = BigDecimal.valueOf(d);
Run Code Online (Sandbox Code Playgroud)

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

System.out.println(bd1);
System.out.println(bd2);
Run Code Online (Sandbox Code Playgroud)

显示:

0.1000000000000000055511151231257827021181583404541015625
0.1
Run Code Online (Sandbox Code Playgroud)

在答案中,回答者说:

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

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

具体来说,哪个更好:

0.1000000000000000055511151231257827021181583404541015625
Run Code Online (Sandbox Code Playgroud)

要么

0.1
Run Code Online (Sandbox Code Playgroud)

?为什么?

Jon*_*eet 10

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

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

鉴于我试图避免陷入这种情况开始,很难给出每个更合适的例子,但是如果你不可避免地将文本转换为a double,那么就丢失了原始文本,但是想要回来该值,然后使用valueOf有可能给你一个更好的结果.如果您对double值执行了一系列算术运算,那么构造函数可能更合适.但它确实非常符合上下文,正如我在大多数情况下所说的那样,我可能会选择重新设计而不是选择任何一种选择.