Следующее не компилируется:
int result = Math.random() + 1;
error: possible loss of precision
int result = Math.random() + 1;
^
required: int
found: double
но следующее компилирует :
int result = 0;
result += Math.random() + 1;
Почему?
Помещая компилируемый код во вложенный цикл, можно ожидать, что результат будет увеличиваться на 1 с каждой итерацией, потому что Math.random () всегда возвращает значение типа double, значение которого меньше 1, а при добавлении к целому числу дробная часть будет потерял из-за потери точности. Запустите следующий код и увидите неожиданный результат:
public class MathRandomCuriosity
{
public static void main(String[] args)
{
int result = 0;
for (int i = 0; i < 10; i++)
{
// System.out.println(result);
for (int j = 0; j < 20; j++)
{
// System.out.println(result);
for (int k = 0; k < 300; k++)
{
// System.out.println(result);
for (int m = 0; m < 7000; m++)
{
result += Math.random() + 1;
}
}
}
}
System.out.println(result);
}
}
При 10 * 20 * 300 * 7000 = 42 000 000 итераций результат должен составить 42 000 000. Но это не так! Результат варьируется, т. Е. 42 000 007 против 42 000 006 против 42 000 010 и т. Д.
Почему?
Кстати ... это не код, который используется где-либо, а из теста, который я получил в новостной рассылке. Причина для вложенных циклов заключается в том, что я могу просматривать значение результата с интервалами.