【发布时间】:2014-06-11 00:28:33
【问题描述】:
我正在尝试在 Java 中模拟 ATM 金额输入,即。假设用户一直输入“1”,显示的数量应该是:
0.00
0.01
0.11
1.11
11.11
111.11
我尝试了 Double 和 BigDecimal 进行处理:
println( ((new BigDecimal(current)).multiply(new BigDecimal(10)).add(new BigDecimal(0.01))).setScale(2, RoundingMode.HALF_UP).toString()) )
println( "" + Double.parseString(current) * 10 + 0.01 )
但是两者似乎都显示了这一点:
0.00
0.01
0.11
1.11
11.1 <<< missing the 0.01 at the end
111.01
它们都是由于精度舍入误差(我认为 BigDecimal 没有这个问题)还是我做错了什么?
【问题讨论】:
-
恕我直言,您永远不应该使用 BigDecimals 或 Doubles 作为货币。如果您想要最准确的转换为便士。并直接与他们合作。
-
您的代码看起来不错,但您的
println行上的操作顺序可能会搞砸。如果将+ ""移到末尾会怎样? -
同意 Doubles 不应该用于货币,但可以使用 BigDecimals - 在您需要控制舍入并且有时需要一美分/美分的会计系统中,它们是最佳选择。跨度>
-
如果你用便士工作,你可以使用
int。BigDecimal让您在会计和税务计算方面更加灵活。
标签: java double bigdecimal