Если вам нужно сместить округление, вы можете добавить небольшой коэффициент.
, например, округлить до 6 десятичных знаков.
double d =
double rounded = (long) (d * 1000000 + 0.5) / 1e6;
, чтобы добавить небольшой коэффициент, который вам нужно решитьсколько дополнительных вы хотите дать.например,
double d =
double rounded = (long) (d * 1000000 + 0.50000001) / 1e6;
например,
public static void main(String... args) throws IOException {
double d1 = 0.0697499994;
double r1 = roundTo4places(d1);
double d2 = 0.0697499995;
double r2= roundTo4places(d2);
System.out.println(d1 + " => " + r1);
System.out.println(d2 + " => " + r2);
}
public static double roundTo4places(double d) {
return (long) (d * 10000 + 0.500005) / 1e4;
}
отпечатки
0.0697499994 => 0.0697
0.0697499995 => 0.0698
Первый правильный.
0.44444444 ... 44445округляется до целого числа 0,0
только 0,500000000 ... 000 или более округляется до 1,0
Нет режима округления, который округляет 0,4 и 0,45.
Если вы думаете об этом, вам нужен равный шанс, что случайное число будет округлено в большую или меньшую сторону.Если вы суммируете достаточно большое количество случайных чисел, ошибка, созданная округлением, отменяется.
Раунд с половиной округляется так же, как
long n = (long) (d + 0.5);
Рекомендуемое округление
long n = (long) (d + 5.0/9);
Random r = new Random(0);
int count = 10000000;
// round using half up.
long total = 0, total2 = 0;
for (int i = 0; i < count; i++) {
double d = r.nextDouble();
int rounded = (int) (d + 0.5);
total += rounded;
BigDecimal bd = BigDecimal.valueOf(d);
int scale = bd.scale();
while (0 < scale) {
bd = bd.setScale(--scale, RoundingMode.HALF_UP);
}
int rounded2 = bd.intValue();
total2 += rounded2;
}
System.out.printf("The expected total of %,d rounded random values is %,d,%n\tthe actual total was %,d, using the biased rounding %,d%n",
count, count / 2, total, total2);
отпечатков
The expected total of 10,000,000 rounded random values is 5,000,000,
the actual total was 4,999,646, using the biased rounding 5,555,106
http://en.wikipedia.org/wiki/Rounding#Round_half_up