【发布时间】:2021-09-18 02:13:44
【问题描述】:
我想获得具有以下属性的 BigDecimal 值:
- 舍入模式:半偶数
- 点后位数:2
我有以下代码:
public BigDecimal standardDeviation() {
MathContext mc = new MathContext (4,RoundingMode.HALF_EVEN);
return new BigDecimal(Math.sqrt(variance().doubleValue()), mc);
}
在我发送一些值的测试中,我遇到了以下失败:
invalid standard deviation ==> expected: <16.73> but was: <16.72>
我该如何解决这个问题?
【问题讨论】:
-
这里的输入值是多少?这似乎只是选择了错误的舍入模式或错误的期望。请注意,HALF_EVEN 意味着
16.725将舍入为16.72而不是16.73,即舍入到偶数邻居。您的意思是改用 HALF_UP 吗? -
对于几个示例,您可能希望显示舍入前、舍入后的值以及预期值。否则无法建议适当的舍入模式来满足您的要求。在处理浮点值时,术语
exactimo 几乎没有意义。 -
请注意,
95.00和95是完全相同的 值,因此如果您要进行计算,这并不重要。请注意,比较BigDecimals不应该使用equals()而是使用compareTo()因为 equals 会报告 95 和 95.0 是不同的(它们是不同的,但不是从数学的角度来看)。 -
您将外观与实际值混淆了。它类似于 0 的
int,您希望将其返回为 00 或 000 或 0000。它没有任何区别。这是格式问题。您可以将其作为字符串返回,但必须将其转换回BigDecimal才能在计算中使用。但根据值的不同,您可能会失去宝贵的精度,这可能会对这些计算产生不利影响。 -
也许有人愿意将所有这些优秀的 cmets 汇集到一个答案中?
标签: java floating-point bigdecimal decimal-point mathcontext