From e258c81f33b31351366606d4c8c65d0cfd46681e Mon Sep 17 00:00:00 2001 From: smklimenko Date: Wed, 13 Mar 2024 21:34:36 +0000 Subject: [PATCH] issue #96: floating point precision Exception --- CHANGELOG.md | 6 +++++ .../brains/view/KdbOutputFormatter.java | 2 +- .../brains/view/console/NumericalOptions.java | 6 +++++ .../view/console/KdbOutputFormatterTest.java | 22 +++++++++++++------ version.properties | 2 +- 5 files changed, 29 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e423dab..f04c0e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # KdbInsideBrains Changelog +## [5.5.1] + +### Fixed + +- issue #96: floating point precision Exception + ## [5.5.0] ### Added diff --git a/src/main/java/org/kdb/inside/brains/view/KdbOutputFormatter.java b/src/main/java/org/kdb/inside/brains/view/KdbOutputFormatter.java index a5ca3d8..7757f99 100644 --- a/src/main/java/org/kdb/inside/brains/view/KdbOutputFormatter.java +++ b/src/main/java/org/kdb/inside/brains/view/KdbOutputFormatter.java @@ -41,7 +41,7 @@ public final class KdbOutputFormatter { for (RoundingMode mode : RoundingMode.values()) { final int modeId = mode.ordinal(); - for (int precision = 0; precision < NumericalOptions.MAX_DECIMAL_PRECISION; precision++) { + for (int precision = 0; precision <= NumericalOptions.MAX_DECIMAL_PRECISION; precision++) { DECIMAL[modeId][precision] = new DecimalFormat("0." + "#".repeat(precision)); DECIMAL[modeId][precision].setRoundingMode(mode); diff --git a/src/main/java/org/kdb/inside/brains/view/console/NumericalOptions.java b/src/main/java/org/kdb/inside/brains/view/console/NumericalOptions.java index 4bf404b..f289f1f 100644 --- a/src/main/java/org/kdb/inside/brains/view/console/NumericalOptions.java +++ b/src/main/java/org/kdb/inside/brains/view/console/NumericalOptions.java @@ -16,6 +16,12 @@ public int getFloatPrecision() { } public void setFloatPrecision(int floatPrecision) { + if (floatPrecision < 0) { + throw new IllegalArgumentException("Precision can't be < 0"); + } + if (floatPrecision > MAX_DECIMAL_PRECISION) { + throw new IllegalArgumentException("Precision can't be > MAX_DECIMAL_PRECISION (" + MAX_DECIMAL_PRECISION + ")"); + } this.floatPrecision = floatPrecision; } diff --git a/src/test/java/org/kdb/inside/brains/view/console/KdbOutputFormatterTest.java b/src/test/java/org/kdb/inside/brains/view/console/KdbOutputFormatterTest.java index 2e0de2d..969a19b 100644 --- a/src/test/java/org/kdb/inside/brains/view/console/KdbOutputFormatterTest.java +++ b/src/test/java/org/kdb/inside/brains/view/console/KdbOutputFormatterTest.java @@ -6,6 +6,7 @@ import org.kdb.inside.brains.view.FormatterOptions; import org.kdb.inside.brains.view.KdbOutputFormatter; +import java.math.BigDecimal; import java.math.RoundingMode; import java.sql.Date; import java.sql.Time; @@ -13,6 +14,7 @@ import java.util.UUID; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; class KdbOutputFormatterTest { private FormatterOptions options; @@ -309,14 +311,20 @@ void nulls() { @Test void precision() { numericalOptions.setScientificNotation(false); - numericalOptions.setFloatPrecision(15); - assertEquals("24.123456789098764", convert(24.1234567890987654321)); - - numericalOptions.setFloatPrecision(2); - assertEquals("24.12", convert(24.1234567890987654321)); + assertThrows(IllegalArgumentException.class, () -> numericalOptions.setFloatPrecision(-1)); + assertThrows(IllegalArgumentException.class, () -> numericalOptions.setFloatPrecision(NumericalOptions.MAX_DECIMAL_PRECISION + 1)); - numericalOptions.setFloatPrecision(0); - assertEquals("24.", convert(24.1234567890987654321)); + final double d = 1.1234567891234567891; + final String s = new BigDecimal(d).toPlainString(); + numericalOptions.setRoundingMode(RoundingMode.DOWN); + for (int i = 0; i <= NumericalOptions.MAX_DECIMAL_PRECISION; i++) { + numericalOptions.setFloatPrecision(i); + numericalOptions.setScientificNotation(false); + assertEquals(s.substring(0, i + 2), convert(d)); + + numericalOptions.setScientificNotation(true); + assertEquals(s.substring(0, i + 2), convert(d)); + } } @Test diff --git a/version.properties b/version.properties index 9967e76..5cfc44b 100644 --- a/version.properties +++ b/version.properties @@ -1 +1 @@ -pluginVersion=5.5.0 \ No newline at end of file +pluginVersion=5.5.1 \ No newline at end of file