aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevinthegreat <92656833+kevinthegreat1@users.noreply.github.com>2025-02-24 00:07:20 -0500
committerKevinthegreat <92656833+kevinthegreat1@users.noreply.github.com>2025-02-24 00:07:20 -0500
commitbc33f40cb3989d6ac1a1d81d9f4cf0b89e831071 (patch)
tree3319fb8ca83ade776f3ba663695e1e0be65fdfb2
parent54b1127efb5f7bfb84ac1d249968ffb035aec72a (diff)
downloadSkyblocker-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.java26
-rw-r--r--src/test/java/de/hysky/skyblocker/utils/CalculatorTest.java53
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));
+ }
}