Почему $ visible отличается от $ watch?
watchExpression оценивается и сравнивается с предыдущим значением в каждом цикле digest (), если в значении watchExpression есть изменение, вызывается функция watch.
$ Наблюдение является специфическим для отслеживания интерполированных значений. Если значение атрибута директивы интерполировано, например, dir-attr="{{ scopeVar }}"
, функция наблюдения будет вызываться только тогда, когда установлено интерполированное значение (и, следовательно, когда $ digest уже определил, что обновления должны быть выполнены). По сути, уже есть наблюдатель для интерполяции, и функция $ наблюдайте за этим.
См. $ Наблюдать & amp; $ set в compile.js
В двух словах: ошибки усечения.
Вы правы, c должно быть 1,0 в точной арифметике. Однако, поскольку вы использовали число с плавающей запятой в аргументах rem, вы получите ответ в виде числа с плавающей запятой. По-видимому, b не совсем 2, а 2,0, что означает, что это двойное значение, очень близкое к 2. Следовательно, b / 2 становится двойным 1,0, по-видимому, в этом случае его значение немного меньше единицы, что дает вам 0 как целочисленное значение. Если вы хотите предотвратить это, используйте и floor, и ceil, и сравните значения.
Если вы хотите преобразовать ответ в целое число, просто используйте round вместо floor.
Если вы добавите строку
d = b-a
в свой пример, вы увидите результат
d =
-4.4409e-016
, означающий, что Matlab вычислил число, близкое, но не точное, к 2 для b. Это очень важно при работе с числами с плавающей запятой. Для получения дополнительной информации попробуйте
help eps
.
Числовые проблемы такого рода также рассматриваются в MATLAB FAQ