mySimpleRoundTo function

double mySimpleRoundTo(
  1. double value,
  2. int digit
)

Simple rounding (corresponds to Pascal MySimpleRoundTo)

Implementation

double mySimpleRoundTo(double value, int digit) {
  if (digit < 0) {
    // Rounding to decimal places: scale by an exact power of ten, then trim
    // binary noise to 15 significant digits (1.005*100 = 100.49999…) before
    // rounding half away from zero, so ROUND(1.005,2) = 1.01 and
    // ROUND(6.6,1) = 6.6 exactly.
    final m = pow(10.0, -digit).toDouble();
    final s = double.parse((value.abs() * m).toStringAsPrecision(15));
    final r = (s + 0.5).floorToDouble();
    return (value < 0 ? -r : r) / m;
  }
  final factor = pow(10.0, digit).toDouble();
  final e = pow(10.0, digit - 1).toDouble() * 5;
  double f;
  if (value < 0) {
    f = (value - e) / factor;
    f = f.truncateToDouble();
  } else {
    f = (value + e) / factor;
    f = f.truncateToDouble();
  }
  return f * factor;
}