From 6e1fb749ad13b98f6e7809269c0832d8ed9e2e9a Mon Sep 17 00:00:00 2001 From: fabianArbeit Date: Mon, 20 Jan 2025 14:29:26 +0100 Subject: [PATCH] Made calculations more precise --- FabianUtil.java | 7 +++---- LoadingBar.java | 20 ++++++++++++++------ 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/FabianUtil.java b/FabianUtil.java index c299ab8..4409fd5 100644 --- a/FabianUtil.java +++ b/FabianUtil.java @@ -2,7 +2,7 @@ package de.vorsorge.theo.util; import java.io.IOException; import java.math.BigDecimal; -import java.math.RoundingMode; +import java.math.MathContext; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; @@ -162,14 +162,13 @@ public class FabianUtil { @Override public void log() { BigDecimal counter = getCounter(); - BigDecimal percentage = BigDecimal.valueOf(100).divide(total, 15, RoundingMode.HALF_UP).multiply(counter); - + BigDecimal percentage = BigDecimal.valueOf(100).divide(total, MathContext.DECIMAL64).multiply(counter); Duration timePassed = getTimePassed(); String remainingTimePart = ""; if (counter.signum() != 0) { BigDecimal secondsPassed = BigDecimal.valueOf(timePassed.getSeconds()); - BigDecimal totalSeconds = secondsPassed.divide(counter, 15, RoundingMode.HALF_UP).multiply(total); + BigDecimal totalSeconds = secondsPassed.divide(counter, MathContext.DECIMAL64).multiply(total); BigDecimal secondsToGo = totalSeconds.subtract(secondsPassed); Duration timeToGo = Duration.of(secondsToGo.longValue(), ChronoUnit.SECONDS); remainingTimePart = ", " + formatDuration(timeToGo) + " verbleibend"; diff --git a/LoadingBar.java b/LoadingBar.java index 74eb378..660a444 100644 --- a/LoadingBar.java +++ b/LoadingBar.java @@ -1,3 +1,5 @@ +import java.math.BigDecimal; +import java.math.MathContext; import java.text.DecimalFormat; import java.time.LocalTime; import java.time.format.DateTimeFormatter; @@ -19,11 +21,12 @@ public class LoadingBar { private static final DecimalFormat PERCENTAGE_FORMAT = new DecimalFormat("00.00"); private static final int MIN_LUNCH_DURATION = 30; private static final LocalTime LATEST_LUNCH_TIME = LocalTime.of(13, 30); - private static final long DEFAULT_NUMBER_WORK_MINS_BEFORE_LUNCH = 5L * 60; - private static final int MAX_NUMBER_WORK_MINS_WITHOUT_LUNCH = 6 * 60; - private static final long MAX_NUMBER_WORK_MINS = 8L * 60; private static final int MINS_PER_HOUR = 60; + private static final long DEFAULT_NUMBER_WORK_MINS_BEFORE_LUNCH = 5L * MINS_PER_HOUR; + private static final int MAX_NUMBER_WORK_MINS_WITHOUT_LUNCH = 6 * MINS_PER_HOUR; + private static final long MAX_NUMBER_WORK_MINS = 8L * MINS_PER_HOUR; private static final int LINE_LENGTH = 100; + private static final MathContext MC_INTEGER = new MathContext(1, RoundingMode.HALF_EVEN); private enum DaySection { @@ -333,9 +336,11 @@ public class LoadingBar { private static String fillLoadingBar(long initialMinutes, long passedMinutes, boolean progressive) { - double wholePercentage = ((double) passedMinutes / initialMinutes) * 100; + BigDecimal wholePercentage = BigDecimal.valueOf(100) + .divide(BigDecimal.valueOf(initialMinutes), MathContext.DECIMAL64) + .multiply(BigDecimal.valueOf(passedMinutes)); long remainingMinutes = initialMinutes - passedMinutes; - int numberOfEquals = (int) wholePercentage; + int numberOfEquals = wholePercentage.intValue(); var sb = new StringBuilder("["); for (int i = 0; i < LINE_LENGTH; i++) { if (i < numberOfEquals) { @@ -354,6 +359,9 @@ public class LoadingBar { private static String minutesToTimeString(long minutes) { - return LocalTime.of((int) minutes / MINS_PER_HOUR, (int) minutes % MINS_PER_HOUR).format(TIME_FORMATTER); + var minutesBD = BigDecimal.valueOf(minutes); + int hours = minutesBD.divide(BigDecimal.valueOf(MINS_PER_HOUR), MC_INTEGER).intValue(); + int rest_minutes = minutesBD.remainder(BigDecimal.valueOf(MINS_PER_HOUR), MC_INTEGER).intValue(); + return LocalTime.of(hours, rest_minutes).format(TIME_FORMATTER); } }