]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.g3d/src/org/simantics/g3d/math/MathTools.java
Eliminate rounding errors in property tabs.
[simantics/3d.git] / org.simantics.g3d / src / org / simantics / g3d / math / MathTools.java
index aa8b0551fdc845ac8db698724f6ad38d7d612b76..b9941c8b94a774605ed91fd55752150fe3aab88d 100644 (file)
@@ -1010,4 +1010,25 @@ public class MathTools {
                mat.m23 = -(f+n)/(f-n);
                return mat;
        }
+
+       /**
+        * Round the number to a given number of decimals, if the rounded result contains at least three
+        * zero trailing decimal places within the rounded result.
+        */
+       public static double round(double value, int nsig) {
+               if (Math.abs(value) < NEAR_ZERO)
+                       return 0.0;
+               
+               int decimals = (int) Math.round(Math.log10(value));
+               int shift = nsig - decimals;
+               double multiplier = Math.pow(10.0, shift);
+               long roundedValue = Math.round(value * multiplier);
+               if (roundedValue % 1000 == 0) {
+                       // Rounding results in at least three zeroes at the end
+                       return roundedValue / multiplier;
+               } else {
+                       // Number was not close to a shorter decimal representation, return it as is
+                       return value;
+               }
+       }
 }