Java BigDecimal round:doubleValue()与价格值中的setScale(2,BigDecimal.round_HALF_UP)比较

Java BigDecimal round:doubleValue()与价格值中的setScale(2,BigDecimal.round_HALF_UP)比较,java,bigdecimal,price,Java,Bigdecimal,Price,我一直在使用BigDecimal来计算价格,但我想知道向用户展示这一点的最佳方式是什么 使用doubleValue()是一种好方法吗 这两种选择之间有什么区别吗 使用doubleValue()是一种好方法吗 如果要避免使用double(或要控制数字的格式),则使用BigDecimal是有意义的。如果你把BigDecimal和double混在一起,我看不出有什么意义。您也可以一直使用double,简化代码 如果要将值转换为字符串,请使用toString例如 BigDecimal bd = ..

我一直在使用
BigDecimal
来计算价格,但我想知道向用户展示这一点的最佳方式是什么

  • 使用
    doubleValue()
    是一种好方法吗
  • 这两种选择之间有什么区别吗
使用doubleValue()是一种好方法吗

如果要避免使用
double
(或要控制数字的格式),则使用BigDecimal是有意义的。如果你把
BigDecimal
double
混在一起,我看不出有什么意义。您也可以一直使用
double
,简化代码

如果要将值转换为字符串,请使用
toString
例如

BigDecimal bd = ...
System.out.println("bd: " + bd.toString());
或者只是

System.out.println("bd: " + bd);
如果您想使用
double
,您可以这样做

double d = 
System.out.printf("%.2f%n", d); // round to 2 decimal places
一个例子说明了为什么BigDecimal比double更容易出错。这两个答案都是错误的,但在
bigdecimic
的情况下,无论是在代码中还是在结果中,都不明显

System.out.println(BigDecimal.valueOf(1.00)
                             .divide(BigDecimal.valueOf(49), 2, BigDecimal.ROUND_HALF_UP)
                             .multiply(BigDecimal.valueOf(49)));
System.out.println(1.00 / 49 * 49);
印刷品

0.98
0.9999999999999999

您可以修复这两个代码,但很容易忽略第一种情况中存在问题的事实。提示:使用
BigDecimal.valueOf
不是问题所在。代码越详细(使用的符号越多),就越难看到重要的细节。

我建议向用户显示setScale(2,BigDecimal.ROUND_HALF_UP)。toPlainString()。

我理解混合使用这两种类型是没有意义的,但是我用这个值做了几次运算,所以我想保留这个运算的BigDecimal,但是在向用户显示价格方面有什么区别吗?我想打印的价格值只有两位小数,这是常见的方式来显示prices@MrGracket请参阅我的最新答案。您也可以使用
double
,但为了一致性,我会使用其中一种。如果使用
double
就可以了,很可能你根本就不需要bigdecime。我不同意任何一种说法,即你可以使用
double
(或
float
)来赚钱。@EJP然而,实际上,大多数投资银行都会使用
double
,因为它不太容易出错。我知道尝试切换到BigDecimal的团队发现它比使用double更糟糕,于是又切换回去了。我在这么多评论后了解到,使用BigDecimal会更精确,但使用double更容易,因此,我将继续在本mattr中进行研究,但目前我将接受您的答案,因为它符合问题,并解释了哪个解决方案更好使用
doubleValue()
绝对不是一个好方法。你不应该用浮点值来赚钱。您应该使用
DecimalFormat
和friends。