Почему floor() округляется в дротике?

-3.6.floorToDouble()

Я ожидаю, что это вернет -4, потому что floor() округляется до отрицательной бесконечности, но на самом деле он возвращает -3. В основном он действует как truncate(). Это ошибка в dart sdk или сделано специально?


person Brixto    schedule 10.05.2021    source источник
comment
В документах говорится, что он возвращает наибольшее целочисленное двойное значение, не превышающее это. поэтому, по крайней мере, -3 не является указанным поведением для ввода -3,6.   -  person kaya3    schedule 10.05.2021
comment
@ kaya3 Не использую дротик, но это определение ceil во всех средах, с которыми я сталкиваюсь и с которыми работаю ... так что дротик меняет значение стандартных математических функций ?! МОЙ БОГ ...   -  person Spektre    schedule 10.05.2021
comment
ceil будет округлять положительные числа. Но пол округляется вниз при положительных значениях и вверх при отрицательных.   -  person Brixto    schedule 10.05.2021
comment
en.wikipedia.org/wiki/Floor_and_ceiling_functions -2,7 будет уменьшен до -3 согласно Википедии   -  person Brixto    schedule 10.05.2021
comment
я обнаружил ошибку в репозитории dart sdk: github.com/dart-lang/sdk/ вопросы/45963   -  person Brixto    schedule 10.05.2021
comment
хорошо, (-3.6).floorToDouble() на самом деле возвращает -4. Но я до сих пор понятия не имею, что происходит, когда я опускаю скобки   -  person Brixto    schedule 10.05.2021
comment
Э-э, без скобок это -(3.6.floor()), что -3.   -  person jamesdlin    schedule 10.05.2021
comment
Обратите внимание, что неоднозначность в приоритете операций редко должна быть проблемой на практике, поскольку неоднозначность в основном связана с числовыми литералами, и люди обычно используют именованные константы или переменные вместо магических чисел.   -  person jamesdlin    schedule 10.05.2021
comment
Значит, это была ошибка прецедентного значения? (/я утки)   -  person Randal Schwartz    schedule 11.05.2021


Ответы (1)


Это артефакт синтаксического анализа.

Выражение -3.6.floorToDouble() означает -(3.6.floorToDouble()), потому что постфикс . связывает сильнее, чем префикс -.

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

person lrn    schedule 10.05.2021