[PATCH] Fixed: rounding problems in iota/salix scenario calculation

Wald Commits scm-commit at wald.intevation.org
Wed Sep 19 16:21:23 CEST 2018


# HG changeset patch
# User mschaefer
# Date 1537366868 -7200
# Node ID e44c1a8b0c5428af5e672efe33fe20abfa38e5d1
# Parent  8562c60371b867c8d62586d37806d8f0f66a887f
Fixed: rounding problems in iota/salix scenario calculation

diff -r 8562c60371b8 -r e44c1a8b0c54 artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/SInfoResultType.java
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/SInfoResultType.java	Tue Sep 18 17:28:22 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/SInfoResultType.java	Wed Sep 19 16:21:08 2018 +0200
@@ -12,6 +12,7 @@
 import java.text.NumberFormat;
 
 import org.apache.commons.lang.StringUtils;
+import org.apache.log4j.Logger;
 import org.dive4elements.artifacts.CallContext;
 import org.dive4elements.river.artifacts.common.AbstractResultType;
 import org.dive4elements.river.artifacts.common.I18NStrings;
@@ -30,6 +31,8 @@
 
     private static final long serialVersionUID = 1L;
 
+    protected static Logger log = Logger.getLogger(SInfoResultType.class);
+
     protected SInfoResultType(final String unit, final String csvHeader) {
         super(unit, csvHeader, csvHeader);
     }
@@ -209,6 +212,8 @@
         @Override
         public String exportValue(final CallContext context, final Object value) {
             final double doubleValue = asDouble(value);
+            log.trace(String.format("meanBedHeight.exportValue value: %f doubleValue: %f formatted to: %s", value, doubleValue,
+                    exportDoubleValue(context, doubleValue)));
             return exportDoubleValue(context, doubleValue);
         }
 
diff -r 8562c60371b8 -r e44c1a8b0c54 artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculator.java
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculator.java	Tue Sep 18 17:28:22 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculator.java	Wed Sep 19 16:21:08 2018 +0200
@@ -167,16 +167,18 @@
         row.putValue(UInfoResultType.waterlevelMH5, hw5);
 
         // Calc salix-line and mw-mnw
-        row.putValue(UInfoResultType.salixline, calcSalix(mhw, mw));
+        row.putValue(UInfoResultType.salixline, calcSalix(mhw, mw, 0.0));
         row.putValue(UInfoResultType.salix_mw_mnw, calcMwmnw(mw, mnw));
-        row.putValue(UInfoResultType.salixw, mhw - SALIX_DISTANCE.doubleValue());
+        final double salixw = Formatter.roundW(mhw).subtract(SALIX_DISTANCE).doubleValue();
+        row.putValue(UInfoResultType.salixw, salixw);
         // Calc scenario values (always all scenario types set, Result variant extracts the fields needed)
         final List<SalixScenario> scenarios = new ArrayList<>();
         final List<Double> deltaws = getDeltaWs(station, rangeScenarios);
         for (final Double deltaw : deltaws) {
             if (deltaw != null) {
-                final double salix = calcSalix(mhw, mw + deltaw);
-                scenarios.add(new SalixScenario((int) (deltaw * 100), salix, mhw + deltaw - SALIX_DISTANCE.doubleValue()));
+                final double salix = calcSalix(mhw, mw, deltaw.doubleValue());
+                final double scen = calcSalix(mhw, 0.0, deltaw.doubleValue());
+                scenarios.add(new SalixScenario((int) (deltaw * 100), salix, scen));
             }
             else {
                 scenarios.add(null);
@@ -199,10 +201,10 @@
     /**
      * Calculates the salix value
      */
-    private double calcSalix(final double mhw, final double mw) {
+    private double calcSalix(final double mhw, final double mw, final double deltamw) {
         if (Double.isNaN(mw) || Double.isInfinite(mw) || Double.isNaN(mhw) || Double.isInfinite(mhw))
-            return mw; // preserving NaN or Infinity
-        return Formatter.roundW(mhw).subtract(SALIX_DISTANCE).subtract(Formatter.roundW(mw)).doubleValue();
+            return mhw - mw; // preserving NaN or Infinity
+        return Formatter.roundW(mhw).subtract(SALIX_DISTANCE).subtract(Formatter.roundW(mw).add(Formatter.roundW(deltamw))).doubleValue();
     }
 
     /**
diff -r 8562c60371b8 -r e44c1a8b0c54 artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixScenario.java
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixScenario.java	Tue Sep 18 17:28:22 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixScenario.java	Wed Sep 19 16:21:08 2018 +0200
@@ -58,11 +58,11 @@
         return this.salixW;
     }
 
-    public String getSalixWFormatted() {
+    public String getSalixWFormatted(final NumberFormat formatter) {
         if (Double.isNaN(this.salixW))
             return StringUtils.EMPTY;
 
-        return String.valueOf(this.salixW);
+        return formatter.format(this.salixW);
     }
 
     public static final String getScenarioValueHeader() {


More information about the Dive4Elements-commits mailing list