sokol92: После умножения на 10000 погрешность увеличится в 10000 раз
а почему тогда простое вычисление 1,1234 * 10 000 даёт 11 234, а возврат ЦЕЛОЙ части от этого же выражения даёт на единицу меньше?
Бесят не сами эти нюансы - бесит то, что Excel то так делает, то так Даже глобально - то он сам пытается всё преобразовать всё подряд, то не может простое (как говорит Дима, "для любого калькулятора") выражение посчитать Дурость
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous написал: Если для получения верного результата нужно вызывать функцию через родителя
нужно понимать с чем имеете дело и отдавать себе отчет как получить требуемый результат (раз 20-30 в разных темах сказано - округляйте, рубайте хвосты, передайте в функцию корректный параметр) в окне Immediate: ? fix(1.1234*10000) 11233 ? fix(round(1.1234*10000,0)) 11234 дело не в fix ,а в значении, у которого ему нужно откинуть цифры после запятой
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Я не вижу недостатков в реализации стандарта double, кроме того, что программист должен ясно понимать, что он делает. Функция Fix при любой реализации является разрывной (как и Round). Что касается MS Office, то компилятор VBA создает высокооптимизированный код (чему мы обычно радуемся в других темах, посященных измерению производительности). Нюансы этого кода нам недоступны. Кстати, одним из видов оптимизации является оптимизация обработки констант. Как справедливо отметил Андрей в #3, результаты меняются, если константу 10000 в выражении заменить на переменную типа Variant, которая имеет значение 10000.
Еще одно гипотетическое объяснение - что в каких-нибудь допотопных версиях Excel функция Fix имела баги. Бережное сохранение багов от версии к версии Excel - религиозный постулат разработчика. И вот решили, как "выход" из положения, по-разному обрабатывать Fix и VBA.Fix. Но всё это конспирология...
sokol92, получается, что при обработке выражения 10 000 * 1,1234 перед отдачей результат пользователю (программисту в код) происходит "магия" корректировки, как и при оборочивании в VBA.Fix(), но при оборачивании в близнеца-полудурка Fix(), этой "магии" не происходит? Так получается?
Надеюсь, можно просто забыть тогда про обычный Fix() и применять его адекватного "брата"
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous, а если нужно сравнить равно-ли 1.1234*10000 - 11234 нулю? и тут нет ни Фикса ни его брата близнеца, то достаточно пользоваться ранее задекларированными знаниями особенностей...)) опять в в окно Immediate: ? 1.1234*10000 - 11234 = 0 False ? round(1.1234*10000) - 11234 = 0 True
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!