diff --git a/SimpleLoadingBar.java b/SimpleLoadingBar.java index 28f4761..4a02a90 100644 --- a/SimpleLoadingBar.java +++ b/SimpleLoadingBar.java @@ -1,3 +1,6 @@ +import java.math.BigDecimal; +import java.math.MathContext; +import java.math.RoundingMode; import java.text.DecimalFormat; import java.time.LocalTime; import java.time.format.DateTimeFormatter; @@ -14,6 +17,7 @@ public class SimpleLoadingBar { private static final DecimalFormat PERCENTAGE_FORMAT = new DecimalFormat("00.00"); private static final int MINS_PER_HOUR = 60; private static final int LINE_LENGTH = 100; + private static final MathContext MC_INTEGER = new MathContext(1, RoundingMode.HALF_EVEN); public static void main(String[] args) { @@ -114,9 +118,11 @@ public class SimpleLoadingBar { private static String fillLoadingBar(long initialMinutes, long passedMinutes, boolean progressive) { - double wholePercentage = ((double) passedMinutes / initialMinutes) * 100; + BigDecimal wholePercentage = BigDecimal.valueOf(100) + .multiply(BigDecimal.valueOf(passedMinutes) + .divide(BigDecimal.valueOf(initialMinutes), MathContext.DECIMAL64)); 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) { @@ -135,7 +141,9 @@ public class SimpleLoadingBar { 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); + BigDecimal[] hoursAndMinutes = minutesBD.divideAndRemainder(BigDecimal.valueOf(MINS_PER_HOUR), MC_INTEGER); + return LocalTime.of(hoursAndMinutes[0].intValue(), hoursAndMinutes[1].intValue()).format(TIME_FORMATTER); }