java110 лет назад: 3
Родитель
Сommit
9a731aebce

+ 7 - 7
java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java

@@ -1925,19 +1925,19 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
         //在当前月中 这块有问题
         if (toDate.getTime() < newFromMaxDay.getTime().getTime()) {
             monthDay = new BigDecimal(newFrom.getActualMaximum(Calendar.DAY_OF_MONTH));
-            return tmpDays.divide(monthDay, 2, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(result)).doubleValue();
+            return tmpDays.divide(monthDay, 4, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(result)).doubleValue();
         }
         // 上月天数
         days = (newFromMaxDay.getTimeInMillis() - t1) * 1.00 / (24 * 60 * 60 * 1000);
         tmpDays = new BigDecimal(days);
         monthDay = new BigDecimal(newFrom.getActualMaximum(Calendar.DAY_OF_MONTH));
-        BigDecimal preRresMonth = tmpDays.divide(monthDay, 2, BigDecimal.ROUND_HALF_UP);
+        BigDecimal preRresMonth = tmpDays.divide(monthDay, 4, BigDecimal.ROUND_HALF_UP);
 
         //下月天数
         days = (t2 - newFromMaxDay.getTimeInMillis()) * 1.00 / (24 * 60 * 60 * 1000);
         tmpDays = new BigDecimal(days);
         monthDay = new BigDecimal(newFromMaxDay.getActualMaximum(Calendar.DAY_OF_MONTH));
-        resMonth = tmpDays.divide(monthDay, 2, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(result)).add(preRresMonth).doubleValue();
+        resMonth = tmpDays.divide(monthDay, 4, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(result)).add(preRresMonth).doubleValue();
         return resMonth;
     }
 
@@ -2233,7 +2233,7 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
         BigDecimal curFeePrice = new BigDecimal(feeDto.getFeePrice());
         if (feeDto.getEndTime().getTime() < rateStartTime.getTime()) {
             curOweMonth = dayCompare(feeDto.getEndTime(), rateStartTime);
-            oweAmountDec = curFeePrice.multiply(new BigDecimal(curOweMonth)).setScale(2, BigDecimal.ROUND_HALF_UP);
+            oweAmountDec = curFeePrice.multiply(new BigDecimal(curOweMonth)).setScale(4, BigDecimal.ROUND_HALF_UP);
         }
 
         curOweMonth = dayCompare(rateStartTime, feeDto.getDeadlineTime());
@@ -2250,7 +2250,7 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
         Date curEndTime = null;
         for (int cycleIndex = 0; cycleIndex < maxCycle; cycleIndex++) {
             //当期增长部分
-            rateDec = preCycleAmount.multiply(new BigDecimal(rate)).setScale(2, BigDecimal.ROUND_HALF_UP);
+            rateDec = preCycleAmount.multiply(new BigDecimal(rate)).setScale(4, BigDecimal.ROUND_HALF_UP);
             //增长周期的倍数
             curCycle = (cycleIndex + 1) * rateCycle;
 
@@ -2261,8 +2261,8 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
             curEndTime = curEndTimeCalender.getTime();
             if (curCycle > curOweMonth) {
                 //不足增长周期增长率
-                rateDec = new BigDecimal(curOweMonth / rateCycle - Math.floor(curOweMonth / rateCycle)).multiply(rateDec).setScale(2, BigDecimal.ROUND_HALF_UP);
-                lastRateAmountDec = new BigDecimal(curOweMonth / rateCycle - Math.floor(curOweMonth / rateCycle)).multiply(preCycleAmount).setScale(2, BigDecimal.ROUND_HALF_UP);
+                rateDec = new BigDecimal(curOweMonth / rateCycle - Math.floor(curOweMonth / rateCycle)).multiply(rateDec).setScale(4, BigDecimal.ROUND_HALF_UP);
+                lastRateAmountDec = new BigDecimal(curOweMonth / rateCycle - Math.floor(curOweMonth / rateCycle)).multiply(preCycleAmount).setScale(4, BigDecimal.ROUND_HALF_UP);
                 addTotalAmount = addTotalAmount.add(rateDec).add(lastRateAmountDec);
                 continue;
             }

+ 69 - 0
service-user/src/test/java/com/java110/user/AppTest.java

@@ -1,9 +1,14 @@
 package com.java110.user;
 
+import com.java110.utils.util.DateUtil;
 import junit.framework.Test;
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
 
+import java.math.BigDecimal;
+import java.util.Calendar;
+import java.util.Date;
+
 /**
  * Unit test for simple App.
  */
@@ -33,7 +38,71 @@ public class AppTest
      */
     public void testApp()
     {
+        Date startTime = DateUtil.getDateFromStringB("2022-07-01");
+        Date endTime = DateUtil.getDateFromStringB("2022-07-27");
+        double month = dayCompare(startTime,endTime);
+        System.out.println(month);
+    }
+
+    /**
+     * 计算 两个时间点月份
+     *
+     * @param fromDate 开始时间
+     * @param toDate   结束时间
+     * @return
+     */
+    public double dayCompare(Date fromDate, Date toDate) {
+        double resMonth = 0.0;
+        Calendar from = Calendar.getInstance();
+        from.setTime(fromDate);
+        Calendar to = Calendar.getInstance();
+        to.setTime(toDate);
+        //比较月份差 可能有整数 也会负数
+        int result = to.get(Calendar.MONTH) - from.get(Calendar.MONTH);
+        //比较年差
+        int month = (to.get(Calendar.YEAR) - from.get(Calendar.YEAR)) * 12;
+
+        //真实 相差月份
+        result = result + month;
+
+        //开始时间  2021-06-01  2021-08-05   result = 2    2021-08-01
+        Calendar newFrom = Calendar.getInstance();
+        newFrom.setTime(fromDate);
+        newFrom.add(Calendar.MONTH, result);
+        //如果加月份后 大于了当前时间 默认加 月份 -1 情况 12-19  21-01-10
+        //这个是神的逻辑一定好好理解
+        if (newFrom.getTime().getTime() > toDate.getTime()) {
+            newFrom.setTime(fromDate);
+            result = result - 1;
+            newFrom.add(Calendar.MONTH, result);
+        }
 
+        // t1 2021-08-01   t2 2021-08-05
+        long t1 = newFrom.getTime().getTime();
+        long t2 = to.getTime().getTime();
+        //相差毫秒
+        double days = (t2 - t1) * 1.00 / (24 * 60 * 60 * 1000);
+        BigDecimal tmpDays = new BigDecimal(days); //相差天数
+        BigDecimal monthDay = null;
+        Calendar newFromMaxDay = Calendar.getInstance();
+        newFromMaxDay.set(newFrom.get(Calendar.YEAR), newFrom.get(Calendar.MONTH), 1, 0, 0, 0);
+        newFromMaxDay.add(Calendar.MONTH, 1); //下个月1号
+        //在当前月中 这块有问题
+        if (toDate.getTime() < newFromMaxDay.getTime().getTime()) {
+            monthDay = new BigDecimal(newFrom.getActualMaximum(Calendar.DAY_OF_MONTH));
+            return tmpDays.divide(monthDay, 4, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(result)).doubleValue();
+        }
+        // 上月天数
+        days = (newFromMaxDay.getTimeInMillis() - t1) * 1.00 / (24 * 60 * 60 * 1000);
+        tmpDays = new BigDecimal(days);
+        monthDay = new BigDecimal(newFrom.getActualMaximum(Calendar.DAY_OF_MONTH));
+        BigDecimal preRresMonth = tmpDays.divide(monthDay, 4, BigDecimal.ROUND_HALF_UP);
 
+        //下月天数
+        days = (t2 - newFromMaxDay.getTimeInMillis()) * 1.00 / (24 * 60 * 60 * 1000);
+        tmpDays = new BigDecimal(days);
+        monthDay = new BigDecimal(newFromMaxDay.getActualMaximum(Calendar.DAY_OF_MONTH));
+        resMonth = tmpDays.divide(monthDay, 4, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(result)).add(preRresMonth).doubleValue();
+        return resMonth;
     }
 }