Merge pull request #421 from wouterla/dev

Rounding issues visible in nightscout insulin field
This commit is contained in:
Milos Kozak 2017-09-18 19:46:40 +02:00 committed by GitHub
commit aa89e8f886
2 changed files with 27 additions and 14 deletions

View file

@ -1,25 +1,37 @@
package info.nightscout.utils; package info.nightscout.utils;
import java.math.BigDecimal;
/** /**
* Created by mike on 20.06.2016. * Created by mike on 20.06.2016.
*/ */
public class Round { public class Round {
public static Double roundTo(double x, Double step) { public static Double roundTo(Double x, Double step) {
if (x != 0d) { return round(x, step, BigDecimal.ROUND_HALF_UP);
return Math.round(x / step) * step;
}
return 0d;
} }
public static Double floorTo(Double x, Double step) { public static Double floorTo(Double x, Double step) {
if (x != 0d) { return round(x, step, BigDecimal.ROUND_FLOOR);
return Math.floor(x / step) * step;
}
return 0d;
} }
public static Double ceilTo(Double x, Double step) { public static Double ceilTo(Double x, Double step) {
if (x != 0d) { return round(x, step, BigDecimal.ROUND_CEILING);
return Math.ceil(x / step) * step; }
}
return 0d; private static Double round(Double x, Double step, int roundingMode) {
BigDecimal numberToRound = new BigDecimal((Double.toString(x)));
BigDecimal stepSize = new BigDecimal((Double.toString(step)));
int scale = getDecimalsFromStep(step);
numberToRound.setScale(scale, BigDecimal.ROUND_HALF_UP);
BigDecimal rounded = numberToRound.divide(stepSize, 0, roundingMode).multiply(stepSize);
return rounded.doubleValue();
}
private static int getDecimalsFromStep(Double step) {
String stepString = Double.toString(step);
return stepString.substring(stepString.indexOf('.') + 1).length();
} }
} }

View file

@ -14,6 +14,8 @@ public class RoundTest {
public void roundToTest() throws Exception { public void roundToTest() throws Exception {
assertEquals( 0.55d, Round.roundTo(0.54d, 0.05d), 0.00000001d ); assertEquals( 0.55d, Round.roundTo(0.54d, 0.05d), 0.00000001d );
assertEquals( 1d, Round.roundTo(1.49d, 1d), 0.00000001d ); assertEquals( 1d, Round.roundTo(1.49d, 1d), 0.00000001d );
assertEquals( 80d, Round.roundTo(65d, 40d), 0.00000001d );
assertEquals( 0d, Round.roundTo(0d, 0.1d), 0.00000001d);
} }
@Test @Test
@ -27,5 +29,4 @@ public class RoundTest {
assertEquals( 0.6d, Round.ceilTo(0.54d, 0.1d), 0.00000001d ); assertEquals( 0.6d, Round.ceilTo(0.54d, 0.1d), 0.00000001d );
assertEquals( 2d, Round.ceilTo(1.49999d, 1d), 0.00000001d ); assertEquals( 2d, Round.ceilTo(1.49999d, 1d), 0.00000001d );
} }
} }