After spending a little bit of time studying methods offered by standard java.lang.Math class I stumbled upon two methods that in combination would allow me to round values up to a power of two.
double Math.scalb(double value) - multiplies given double value by the given power of two,
double Math.iround(double value) - discards everything to the right of the decimal point.
So here's what needs to be done:
- Divide the given double value by the given power of two.
- Discard the decimal part.
- Multiply the result by the given power of two.
Here's the method:
public static double round(double value, int power) {
// Divide value by 2^power
double scaled = Math.scalb(value, -power);
// Discard the fractional part, multiply back by 2^power
return Math.scalb(Math.rint(scaled), power);
}
This approach is great when you compare Doubles with tolerance and need equal hash codes for equal values.Don't forget that rounding is done up to a certain power of two:
| Powers of two. | Values that the fractional part may assume. |
| -1 | 0.5 |
| -2 | 0.25, 0.5, 0.75 |
| -3 | 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875 |