diff options
| author | Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> | 2025-02-24 00:07:20 -0500 |
|---|---|---|
| committer | Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> | 2025-02-24 00:07:20 -0500 |
| commit | bc33f40cb3989d6ac1a1d81d9f4cf0b89e831071 (patch) | |
| tree | 3319fb8ca83ade776f3ba663695e1e0be65fdfb2 | |
| parent | 54b1127efb5f7bfb84ac1d249968ffb035aec72a (diff) | |
| download | Skyblocker-bc33f40cb3989d6ac1a1d81d9f4cf0b89e831071.tar.gz Skyblocker-bc33f40cb3989d6ac1a1d81d9f4cf0b89e831071.tar.bz2 Skyblocker-bc33f40cb3989d6ac1a1d81d9f4cf0b89e831071.zip | |
Fix #1188 sign calculator floating point errors
| -rw-r--r-- | src/main/java/de/hysky/skyblocker/skyblock/calculators/SignCalculator.java | 26 | ||||
| -rw-r--r-- | src/test/java/de/hysky/skyblocker/utils/CalculatorTest.java | 53 |
2 files changed, 48 insertions, 31 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/calculators/SignCalculator.java b/src/main/java/de/hysky/skyblocker/skyblock/calculators/SignCalculator.java index 265073bb..0b52fde5 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/calculators/SignCalculator.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/calculators/SignCalculator.java @@ -6,6 +6,7 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; import net.minecraft.text.Text; import net.minecraft.util.Formatting; +import org.jetbrains.annotations.VisibleForTesting; import java.text.NumberFormat; import java.util.Locale; @@ -26,21 +27,26 @@ public class SignCalculator { if (message.startsWith("=")) { message = message.substring(1); } - //only update output if new input - if (!message.equals(lastInput)) { // - try { - output = Calculator.calculate(message); - } catch (Exception e) { - output = -1; - } - } + calculate(message); render(context, message, renderX, renderY); lastInput = message; } - public static String getNewValue(Boolean isPrice) { + @VisibleForTesting + public static void calculate(String message) { + //only update output if new input + if (!message.equals(lastInput)) { + try { + output = Calculator.calculate(message); + } catch (Exception e) { + output = -1; + } + } + } + + public static String getNewValue(boolean isPrice) { if (output == -1) { //if mode is not activated or just invalid equation return what the user typed in return lastInput; @@ -48,7 +54,7 @@ public class SignCalculator { //price can except decimals and exponents if (isPrice) { - return String.valueOf(output); + return String.valueOf(Math.round(output * 100d) / 100d); } //amounts want an integer number so round return Long.toString(Math.round(output)); diff --git a/src/test/java/de/hysky/skyblocker/utils/CalculatorTest.java b/src/test/java/de/hysky/skyblocker/utils/CalculatorTest.java index c29efdf2..22187004 100644 --- a/src/test/java/de/hysky/skyblocker/utils/CalculatorTest.java +++ b/src/test/java/de/hysky/skyblocker/utils/CalculatorTest.java @@ -1,31 +1,42 @@ package de.hysky.skyblocker.utils; +import de.hysky.skyblocker.skyblock.calculators.SignCalculator; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; public class CalculatorTest { - @Test - void testShorthands() { - Assertions.assertEquals(Calculator.calculate("1k"), 1000); - Assertions.assertEquals(Calculator.calculate("0.12k"), 120); - Assertions.assertEquals(Calculator.calculate("1k + 0.12k"), 1120); - Assertions.assertEquals(Calculator.calculate("1 + 1s + 1k + 1m + 1b"), 1001001065); - } + @Test + void testShorthands() { + assertCalculation(1000, "1k"); + assertCalculation(120, "0.12k"); + assertCalculation(1120, "1k + 0.12k"); + assertCalculation(1001001065, "1 + 1s + 1k + 1m + 1b"); + } - @Test - void testPrecedence() { - Assertions.assertEquals(Calculator.calculate("5 + 2 * 2"), 9); - Assertions.assertEquals(Calculator.calculate("5 - 2 / 2"), 4); - Assertions.assertEquals(Calculator.calculate("5 * (1 + 2)"), 15); - } + @Test + void testPrecedence() { + assertCalculation(9, "5 + 2 * 2"); + assertCalculation(4, "5 - 2 / 2"); + assertCalculation(15, "5 * (1 + 2)"); + } - @Test - void testImplicitMultiplication() { - Assertions.assertEquals(Calculator.calculate("5(2 + 2)"), 20); - } + @Test + void testImplicitMultiplication() { + assertCalculation(20, "5(2 + 2)"); + } - @Test - void testImplicitClosingParenthesis() { - Assertions.assertEquals(Calculator.calculate("5(2 + 2"), 20); - } + @Test + void testImplicitClosingParenthesis() { + assertCalculation(20, "5(2 + 2"); + } + + @Test + void testFloatingPointError() { + SignCalculator.calculate("262.6m"); + Assertions.assertEquals("2.626E8", SignCalculator.getNewValue(true)); + } + + private void assertCalculation(double expected, String input) { + Assertions.assertEquals(expected, Calculator.calculate(input)); + } } |
