|
VBA - Остерегайтесь ошибок в вычислениях (функция int())
|
|||
---|---|---|---|
#18+
Статья Даниеля Пино - VBA - Остерегайтесь ошибок в вычислениях (функция int()) https://www.devhut.net/2019/04/11/vba-beware-of-flawed-math/ Я решил, что расскажу об ошибке, доведенной до моего сведения Джейсоном , касающуюся проблемы с использованием функции Int() . Всегда были проблемы с вычислениями из-за проблем с плавающей запятой, о которых я даже не собираюсь рассказывать в этом посте. Есть гораздо большие умы, которые разрабатывали эту тему в прошлом. Тем не менее, всякий раз, когда вам нужно выполнить какой-либо расчет, лучше всего всегда использовать денежные или десятичные типы данных. Возвращаясь к сегодняшнему сообщению, проблема с функцией Int(). Int () используется для возврата целой части числа из числа. Так, Код: plaintext 1. 2. 3. 4. 5.
Недостаток! В Access Query В запросе Код: sql 1.
Результаты в Код: plaintext
В рабочем листе Excel Код: plaintext
Код: plaintext
НО В VBA (ошибка) Код: plaintext 1. 2. 3.
но возникает проблема с Код: plaintext 1.
или в простой функции, как Код: vbnet 1. 2. 3.
Код: plaintext 1.
Теперь, поскольку в VBA существует такая проблема, это означает, что это общая ошибка Office VBA, а не только Access! Так что будьте предупреждены, та же проблема будет существовать в Excel, Word, ... Где это зацепит нас точно Теперь, когда, очевидно, на базовую математическую функцию, такую, как Int() , нельзя положиться, что делать ?! Что ж, я опубликовал эту проблему в Access Dev Team и пока не получил ответа, но, как обычно, мои коллеги из MVP готовы предложить свою помощь! Густав Брок указал, что использование функции преобразования заставит Int() вести себя правильно. Таким образом, обходной путь становится Код: plaintext 1.
или же Код: plaintext 1.
Итак, да, вам нужно применять преобразование везде, где вы используете Int(), чтобы убедиться, что оно работает правильно! В случае функции переключение типа данных с Double на Currency устранит проблему Код: vbnet 1. 2. 3.
Код: plaintext 1.
Код: vbnet 1. 2. 3.
Код: plaintext 1.
Как всегда, когда я получу ответ от команды Access Dev, я опубликую любую дополнительную информацию, которой они смогут поделиться с нами. Обновление 2019-04-18, 2019-05-01 Что ж, прошло всего 3 недели, и от команды разработчиков не было никаких комментариев/ответов по поводу моего электронного письма на эту тему, поэтому я полагаю, что не получу от них никаких отзывов по этому вопросу. Так что просто убедитесь, что ВСЕГДА используйте преобразования везде, где вы используете функцию Int(), чтобы избежать каких-либо ошибочных результатов !!! ... и если эта проблема существует в Int(), должны ли мы беспокоиться о других математических функциях? Это настоящий вопрос! Обновление 2019-04-24 Просто добавлена информация, касающаяся тестирования выше. Когда я писал статью, я работал под управлением Access 2013 x32 на Windows 7, с тех пор я тестировал (с такими же результатами) Access 2003 в Windows XP Access 2007 SP3 (x32) в Windows 7 Access 2010 SP2 (x32) в Windows 7 Access 2013 (x32) в Windows 10 (версия 1803, сборка ОС 17134.706) Access 2016 (x32) в Windows 7 Дальнейшие ресурсы по теме В комментариях ниже Люк Чунг , президент FMS Inc. , только что поделился со мной техническим документом, который он выпустил более 20 лет назад, в котором подробно об этом и многом другом! Поэтому не забудьте проверить, When Microsoft Access Math Doesn’t Add Up , чтобы убедиться, что вы знаете о множестве математических проблем и о том, как наилучшим образом обеспечить надежность ваших расчетов. ------------------------------------------------------------- А ты вложил уже свой кровный рубль в 50-ти миллиардное состояние Билла Гейтса? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2019, 10:58 |
|
VBA - Остерегайтесь ошибок в вычислениях (функция int())
|
|||
---|---|---|---|
#18+
Joss, я так понимаю, что этот Даниель Пино вчера вылупился? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2019, 11:24 |
|
VBA - Остерегайтесь ошибок в вычислениях (функция int())
|
|||
---|---|---|---|
#18+
Это именно "из-за проблем с плавающей запятой". Некоторые десятичные числа невозможно представить в двоичной системе со 100% точностью. Например 0.3 может выглядеть как 0.299999999999, поэтому: Код: vbnet 1. 2.
А Int() честно отбрасывает дробную часть и возвращает 11. Для наглядности? Код: vbnet 1. 2. 3. 4.
В данном случае 0.3 имеет тип Double (в VBA по умолчанию для дробных чисел). Что интересно, есть тип Single, который еще грубее но здесь: Код: vbnet 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2019, 11:41 |
|
VBA - Остерегайтесь ошибок в вычислениях (функция int())
|
|||
---|---|---|---|
#18+
прежде чем искать ошибку в стандартной функции VBA ("проверенной веками") надо спросить себя:"а все-ли я правильно делаю?" -тип Double,в принципе,не может дать точный результат ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2019, 12:05 |
|
VBA - Остерегайтесь ошибок в вычислениях (функция int())
|
|||
---|---|---|---|
#18+
вдогонку:безумно "нравится" когда бестолочь искренне считает себя умней других и пытается оспорить что-то устоявшееся(существует куча доказательств что 2*2=5-кроме смеха и убежденности в том,что автор полный идиёт это не вызывает) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2019, 12:13 |
|
VBA - Остерегайтесь ошибок в вычислениях (функция int())
|
|||
---|---|---|---|
#18+
Вчера-не вчера. И о точности то же известно. Но вот можешь нечаянно вляпаться. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2019, 12:14 |
|
VBA - Остерегайтесь ошибок в вычислениях (функция int())
|
|||
---|---|---|---|
#18+
sdkuпрежде чем искать ошибку в стандартной функции VBA ("проверенной веками") надо спросить себя:"а все-ли я правильно делаю?" -тип Double,в принципе,не может дать точный результат 100500 Я ужо думал, что не дождусь этой (правильной реакции) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2019, 12:22 |
|
VBA - Остерегайтесь ошибок в вычислениях (функция int())
|
|||
---|---|---|---|
#18+
JossВчера-не вчера. И о точности то же известно. Но вот можешь нечаянно вляпаться.И что даст это обсуждение? Это описано на сто раз в учебниках по VBA. А уж если придётся встрять, то и сто первый раз не поможет. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2019, 12:23 |
|
VBA - Остерегайтесь ошибок в вычислениях (функция int())
|
|||
---|---|---|---|
#18+
ПанургJossВчера-не вчера. И о точности то же известно. Но вот можешь нечаянно вляпаться.И что даст это обсуждение? Это описано на сто раз в учебниках по VBA. А уж если придётся встрять, то и сто первый раз не поможет. +100500 В принципе ничего... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2019, 13:25 |
|
|
start [/forum/topic.php?fid=45&msg=39837831&tid=1610589]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
45ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
others: | 322ms |
total: | 457ms |
0 / 0 |