3 回答

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超10個(gè)贊
我的感覺是,這里的問題不是丟棄原始價(jià)格,而是通過將小數(shù)截?cái)嗟叫?shù)點(diǎn)后兩位來丟棄有價(jià)值的信息。如果你再保留一位小數(shù),你就不會有這個(gè)問題。
這是一個(gè)保留 6 位精度的示例,以允許足夠的精度來對我最終只需要兩位有效小數(shù)位的值進(jìn)行數(shù)百次操作。如果您最后只關(guān)心 2 位,您將永遠(yuǎn)不會遇到 6 位小數(shù)的舍入問題。
此代碼保留 6 個(gè)位置,但打印單日價(jià)格時(shí)除外,此時(shí)它四舍五入到 2 個(gè)位置。
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
結(jié)果:
71.67
215.00

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超2個(gè)贊
讓我們這樣看。內(nèi)存和通信很便宜。
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);
此時(shí),您有三個(gè)變量。鑒于內(nèi)存(主 RAM 和輔助磁盤/DB)和通信都很便宜,您可以只保留 totalPrice 變量。您無需從 perNightPrice 和 numNight 對其進(jìn)行逆向工程。
我以前也遇到過這種情況。我們只是更改 API 和/或數(shù)據(jù)表定義以允許我們保留更多數(shù)據(jù)(除非您在 Lunar-Lander 中報(bào)廢內(nèi)存——我懷疑這種情況,因?yàn)?Lunar-Lander 不計(jì)算酒店價(jià)格) .

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
可以提高到一定的精度嗎?
final BigDecimal price = BigDecimal.valueOf(215).setScale(10, BigDecimal.ROUND_HALF_EVEN);
final BigDecimal daysOfThisReservation = BigDecimal.valueOf(3).setScale(10, BigDecimal.ROUND_HALF_EVEN);
添加回答
舉報(bào)