为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Java 中处理 BigDecimal 中的路由

如何在 Java 中处理 BigDecimal 中的路由

慕少森 2022-10-07 17:44:32
我有这个代码来获得一个百分比:final BigDecimal price = BigDecimal.valueOf(215).setScale(2, BigDecimal.ROUND_HALF_EVEN);final BigDecimal daysOfThisReservation = BigDecimal.valueOf(3).setScale(2, BigDecimal.ROUND_HALF_EVEN);final BigDecimal dayPrice = price.divide(daysOfThisReservation, BigDecimal.ROUND_HALF_EVEN).setScale(2, BigDecimal.ROUND_HALF_EVEN);System.out.println(dayPrice); //71.67System.out.println(dayPrice.multiply(daysOfThisReservation).setScale(2, BigDecimal.ROUND_HALF_EVEN)); //215.01我有一个 215.00 美元的预订,这个预订每天有 3 个,所以价格是 71.67 美元。如果我尝试再次获取原始值,我会遇到一些舍入问题,71.67 * 3 = 215.01如何处理此类问题?
查看完整描述

3 回答

?
慕桂英546537

TA贡献1848条经验 获得超10个赞

我的感觉是,这里的问题不是丢弃原始价格,而是通过将小数截断到小数点后两位来丢弃有价值的信息。如果你再保留一位小数,你就不会有这个问题。


这是一个保留 6 位精度的示例,以允许足够的精度来对我最终只需要两位有效小数位的值进行数百次操作。如果您最后只关心 2 位,您将永远不会遇到 6 位小数的舍入问题。


此代码保留 6 个位置,但打印单日价格时除外,此时它四舍五入到 2 个位置。


final BigDecimal price = BigDecimal.valueOf(215).setScale(6, BigDecimal.ROUND_HALF_EVEN);

final BigDecimal daysOfThisReservation = BigDecimal.valueOf(3).setScale(6, BigDecimal.ROUND_HALF_EVEN);


final BigDecimal dayPrice = price.divide(daysOfThisReservation, BigDecimal.ROUND_HALF_EVEN).setScale(6, BigDecimal.ROUND_HALF_EVEN);


System.out.println(dayPrice.setScale(2, BigDecimal.ROUND_HALF_EVEN));

System.out.println(dayPrice.multiply(daysOfThisReservation).setScale(2, BigDecimal.ROUND_HALF_EVEN)); //215.01

结果:


71.67

215.00


查看完整回答
反对 回复 2022-10-07
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

让我们这样看。内存和通信很便宜。


BigDecimal totalPrice = new BigDecimal(double 215.00);

int numNight = 3;

BigDecimal perNightPrice = totalPrice

    .divide(new BigDecimal(int numNight), BigDecimal.ROUND_HALF_EVEN)

    .setScale(2, BigDecimal.ROUND_HALF_EVEN);

此时,您有三个变量。鉴于内存(主 RAM 和辅助磁盘/DB)和通信都很便宜,您可以只保留 totalPrice 变量。您无需从 perNightPrice 和 numNight 对其进行逆向工程。


我以前也遇到过这种情况。我们只是更改 API 和/或数据表定义以允许我们保留更多数据(除非您在 Lunar-Lander 中报废内存——我怀疑这种情况,因为 Lunar-Lander 不计算酒店价格) .


查看完整回答
反对 回复 2022-10-07
?
12345678_0001

TA贡献1802条经验 获得超5个赞

可以提高到一定的精度吗?


final BigDecimal price = BigDecimal.valueOf(215).setScale(10, BigDecimal.ROUND_HALF_EVEN);

final BigDecimal daysOfThisReservation = BigDecimal.valueOf(3).setScale(10, BigDecimal.ROUND_HALF_EVEN);



查看完整回答
反对 回复 2022-10-07
  • 3 回答
  • 0 关注
  • 126 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信