【发布时间】:2015-08-25 05:47:18
【问题描述】:
我有一个表示金额的方法的输入,即 X 件商品的总价格。
这可以是多种货币下的金额,并由 double 表示。
问题:我想将此金额分解为 X 件商品的价格。考虑到金额本身是double,我担心的是,如果我只是这样做:amount/X 我可能会得到一个number*X 不会给我amount 的数字,这正是由于例如四舍五入。我怎样才能正确地做到这一点?
注意:请帮我理所当然地认为我不能将 amount 更改为 double 以外的其他东西
【问题讨论】:
-
您可以将双精度转换为
BigDecimal并使用它进行计算。 -
@Kayaman:你认为这会有什么帮助?
-
@tmyklebu 好吧,它可以让你进行精确的计算。但是,如果其他部分期望
double,这仅意味着代码一开始就被破坏了。如果您正在处理金钱,您需要使用BigDecimal,直到您为用户打印结果(他们很可能不希望看到诸如10.000000000256之类的值)。 -
@Kayaman:BigDecimal 不能准确地表示有理数。它仍然是一种浮点格式,并且鸽笼原理仍然适用——仍然有一个 BigDecimal f 使得 (1/f)*f != 1。(“如果你在处理金钱,你需要工作顺便说一句,使用 BigDecimal" 是完全错误的;许多金融应用程序都可以使用双精度数。)
标签: java types floating-point double rounding