From 9aaa464e9caacf9ef7af45e2414b3257dadbc64f Mon Sep 17 00:00:00 2001 From: deibudei Date: Wed, 6 May 2026 15:25:35 +0800 Subject: [PATCH] =?UTF-8?q?fix(repair):=20=E4=BF=AE=E5=A4=8D=20OrderServic?= =?UTF-8?q?e.calculateDiscountPrice=20=E7=9A=84=20double=20=E7=B2=BE?= =?UTF-8?q?=E5=BA=A6=E4=B8=A2=E5=A4=B1=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/targetservice/service/OrderService.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/target-service/src/main/java/com/example/targetservice/service/OrderService.java b/target-service/src/main/java/com/example/targetservice/service/OrderService.java index 60e9cf4..2ca0970 100644 --- a/target-service/src/main/java/com/example/targetservice/service/OrderService.java +++ b/target-service/src/main/java/com/example/targetservice/service/OrderService.java @@ -15,8 +15,7 @@ public int calculateUnitPrice(int totalCents, int quantity) { } /** - * Calculates the discounted price for a bulk order. - * BUG: Uses double for intermediate calculation, causing floating-point precision loss. + * Calculates the discounted price for a bulk order using exact decimal arithmetic. */ public BigDecimal calculateDiscountPrice(BigDecimal total, double discountRate, int quantity) { if (quantity <= 0) { @@ -25,7 +24,7 @@ public BigDecimal calculateDiscountPrice(BigDecimal total, double discountRate, if (discountRate <= 0 || discountRate >= 1) { throw new IllegalArgumentException("discountRate must be between 0 and 1, but got: " + discountRate); } - double perItem = total.doubleValue() * discountRate; - return BigDecimal.valueOf(perItem * quantity); + BigDecimal rate = BigDecimal.valueOf(discountRate); + return total.multiply(rate).multiply(BigDecimal.valueOf(quantity)); } }