Арифметика скандальным образом применяется к null

Jan 08, 2013 16:54


Какой кошмар. В Javascript null/1e6= …нет, не null и не NaN (Not a Number - не число), и ошибку не выбрасывает. Это, видите ли, 0! Обычный ноль, который дальше спокойно участвует в вычислениях.

Увы и ах, и Javascript и PHP как ни в чём ни бывало производят с null’ом арифметические операции, втихомолку конвертируя его в ноль.

Это неожиданное ( Read more... )

javascript, php, Web-программирование, postgresql

Leave a comment

sergeyvsorokin January 9 2013, 15:32:17 UTC
А какой смысл вы видите в арифметических операциях над null?

Это может зависеть от области применения расчётов. Я, например, изрядно намаялся когда считал результаты соревнований в Excel, который, например при сложении пустых ячеек с помощью + даёт ошибку, а с помощью функции sum - 0. Оба варианта на самом деле не подходят, и я замучился писать проверки аргументов.

Скажем, если мы считаем штраф, и 0 - штрафа нет, а null - участника тут совсем не было (моя первая интерпретация, что значит null), то сложить сумму из одних null и получить в результате 0 очень плохо: участник, который не появлялся ни на одном этапе в результате выигрывает. Здесь надо чтобы сумма null давала null (что в целом выглядит разумно). Смешанная сумма null+not null должна давать ошибку, ибо в данной схеме требуется какая-то отдельная обработка данной ситуации (штраф за пропуск этапа, определённый регламентом).

С другой стороны, если считать что участник получает баллы которых чем больше, тем лучше, то скорее всего вариант sum(null,null,...)=0 подойдёт, так же как и смешанный вариант sum(null,N)=N.

Вариант null/N=0 вообще достаточно странный, ибо если у нас ничего не было (null) и мы его поделили на N частей, то у нас должно в результате получиться опять ничего (null), я бы сделал так. Null/N=0 в некотором смысле отождествляет null и 0, что выглядит неразумным. Если понимать null как "значение неизвестно" (ещё одна возможная интерпретация), то "не знаю сколько"/N должно быть равно "не знаю сколько". Интерпретацию, для которой в результате разумно получить 0, я пока придумать не могу.

Сергей

Reply

torbasow January 13 2013, 14:55:24 UTC
null - участника тут совсем не было (моя первая интерпретация, что значит null)

Насколько я понимаю теорию реляционных баз данных, если участника совсем не было, то не должно быть соответствующей записи, а если запись есть,- значит, участник был, но его результат (пока) неизвестен.

Reply

sergeyvsorokin January 13 2013, 18:47:07 UTC
В правилах автомобильных соревнований часто число баллов, получаемых участником, зависит от занятого места и числа заявленных участников. Участник может заявится, но не выйти участвовать - например, машина сломалась в предыдущей попытке. Но считать для количества его всё равно надо. Можно провести параллель с "запись должна быть".

Reply


Leave a comment

Up