java - 价格值中的 BigDecimal 舍入 : doubleValue() vs setScale(2, BigDecimal.ROUND_HALF_UP)

标签 java bigdecimal price

我一直使用 BigDecimal 来显示价格,但我想知道向用户显示此信息的最佳方式是什么。

  • 使用 doubleValue() 是个好方法吗?
  • 这两个选项有什么区别吗?

最佳答案

Is using doubleValue() a good way?

如果您想避免使用 double(或者您想控制数字的格式),则使用 BigDecimal 是有意义的。如果你混合 BigDecimaldouble 我不明白这一点。您也可以一直使用 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 更容易出错。这两个答案都是错误的,但在 BigDecimal 的情况下,无论是在代码中还是在看起来不错的结果中,这一点都不明显

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 不是问题。代码越冗长(使用的符号越多),就越难看到重要的细节。

关于java - 价格值中的 BigDecimal 舍入 : doubleValue() vs setScale(2, BigDecimal.ROUND_HALF_UP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39287506/

相关文章:

Java - 平衡 BinarySearchTree 的 JUnit 测试

java - 大数字的 BigDecimal 在浮点值中无法正常工作

java - 如何将 DecimalFormat 的小数点分隔符从逗号更改为点/点?

Java BigDecimal 类

php - Woocommerce wc_price 过滤器使用

php - 如果产品在 Woocommerce 中不征税,则隐藏额外的不含税价格

java - UML 到 Java 代码生成工具

java - 当我创建日历实例时,该月的第一天 = 2

java - Sonar 违规 : "Method may fail to close stream on exception"

javascript - PHP 函数输出仅在点击页面后更新