Страницы: Пред. 1 2
RSS
Получаю разное значение при одинаковых условиях в функциях Int и Fix
 
Цитата
sokol92: После умножения на 10000 погрешность увеличится в 10000 раз
а почему тогда простое вычисление 1,1234 * 10 000 даёт 11 234, а возврат ЦЕЛОЙ части от этого же выражения даёт на единицу меньше?

Бесят не сами эти нюансы - бесит то, что Excel то так делает, то так
Даже глобально - то он сам пытается всё преобразовать всё подряд, то не может простое (как говорит Дима, "для любого калькулятора") выражение посчитать
Дурость
Изменено: Jack Famous - 09.09.2021 15:09:08
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
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 - 09.09.2021 15:32:56
Владимир
 
sokol92, получается, что при обработке выражения 10 000 * 1,1234 перед отдачей результат пользователю (программисту в код) происходит "магия" корректировки, как и при оборочивании в VBA.Fix(), но при оборачивании в близнеца-полудурка Fix(), этой "магии" не происходит? Так получается?

Надеюсь, можно просто забыть тогда про обычный Fix() и применять его адекватного "брата"  :D
Изменено: Jack Famous - 09.09.2021 15:41:02
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Это риторический вопрос - нужен исходный код (которого нет).
Владимир
 
sokol92, тогда скрестим пальцы и погнали  :D
Спасибо  ;)  :idea:
Изменено: Jack Famous - 09.09.2021 15:48:09
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous,
а если нужно сравнить равно-ли 1.1234*10000 - 11234  нулю?
и тут нет ни Фикса ни его брата близнеца, то достаточно пользоваться ранее задекларированными знаниями особенностей...))
опять в в окно Immediate:
? 1.1234*10000 - 11234 = 0
False
? round(1.1234*10000) - 11234 = 0
True
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Страницы: Пред. 1 2
Наверх