У меня есть double[]
, и у него есть значение NaN
. Когда я складываю элементы массива, NaN
тоже дает результат NaN
.
Как это произошло? Как я могу предотвратить добавление этого NaN
в остальную часть моего массива?
У меня есть double[]
, и у него есть значение NaN
. Когда я складываю элементы массива, NaN
тоже дает результат NaN
.
Как это произошло? Как я могу предотвратить добавление этого NaN
в остальную часть моего массива?
NaN
означает "не число". Он может возникать разными способами, например, в результате 0./0.
, sqrt(-1)
, или в результате расчета с участием других NaNs
.
Самый простой способ проверить, является ли v
NaN
, - использовать _ 7_:
public static double sum(double arr[]) {
double sum = 0.0;
for (double val : arr) {
if (!Double.isNaN(val)) {
sum += val;
}
}
return sum;
}
edit: @Stephen C хорошо замечает в комментариях: прежде чем вы решите проигнорировать это NaN
, было бы благоразумно понять, откуда оно взялось. Возможно, это результат ошибки в другом месте вашего кода, и, слепо игнорируя NaN
, вы могли бы просто замаскировать ошибку, а не исправлять ее.
NaN означает «не число», поэтому «не число» + 10 = «не число».
Возможно, вы захотите отладить свое приложение, чтобы найти то, что находится в двойном массиве :)
как я могу предотвратить добавление этого NaN к остальной части моего double []
Сюда:
double[] array = something;
double sum = 0;
for (int i = 0; i < array.length; i++) {
if (!Double.isNaN(array[i])) {
sum += array[i];
}
}
(x+0=x)
, но в общем случае, например при вычислении среднего все будет иначе: вы просто не считаете NaN. Фактически, именно для этого изначально были изобретены NaN: представление отсутствующих значений.
- person Joonas Pulakka; 24.01.2012
Документация Javadoc для NaN
public static final double NaN
Константа, содержащая нечисловое (NaN) значение типа double. Это эквивалентно значению, возвращаемому Double.longBitsToDouble (0x7ff8000000000000L).
И в соответствующем разделе спецификации JVM говорится любая операция, включающая NaN
, также является NaN
(немного похожа на null
в SQL)
Вы не можете просто игнорировать NaN, это индикатор проблемы с вашей программой. Вам нужно выяснить, что вызывает NaN, и исправить это.
NaN - не число
кстати попробуйте:
double[] array = new double[10];
String result = StringUtils.join(array);
System.out.println(result+ " BATMAN !");
Java - не моя сильная сторона, но в других языках это связано с присвоением значения из строки. Попробуй это:
parseDouble
public static double parseDouble(String s)
throws NumberFormatException
Возвращает новый тип double, инициализированный значением, представленным указанной строкой, как это выполняется методом valueOf класса Double. Параметры: s - строка для анализа. Возвращает: двойное значение, представленное строковым аргументом. Выдает: NumberFormatException - если строка не содержит синтаксического двойника. Начиная с: 1.2 См. Также: valueOf (String)
Взято из здесь.
parseDouble()
не производит NaN
значений ... если вы не попытаетесь проанализировать строку "NaN"
. Если вы попытаетесь проанализировать недопустимую числовую строку, вы получите исключение, а не NaN
.
- person Stephen C; 23.01.2012