|
VBA, вычитание с неправильным результутом (ms access)
|
|||
---|---|---|---|
#18+
Доброго времени суток. Столкнулся я в своей базе (access) с проблемой при работе с дробными числами (чертовы копейки) - два одинаковых числа при сравнении оказывались разными. В оригинале это выглядит как "If (rst2!cert_sum / rst2!cert_days) * rst1!days <> rst1!sum Then". Упростив пример, и откинув взаимодействие с таблицами, дабы отсечь возможные причины, пришел к следующему: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
В таком виде получаем на выходе "1861,2 __ 1861,2 __ 0". Всё верно. Меняем исходные, теперь temp6 вычислим. Код: vbnet 1. 2. 3. 4. 5. 6. 7.
И на выходе... "1861,2 __ 1861,2 __ 1,220703E-04". А надо 0. Честно пытался нагуглить, не вышло. И со второй странностью столкнулся. Тот же (второй) код, но объявление заменил на "Dim temp3, temp4, temp5, temp6, temp7 As Single". Ничего ведь не должно было измениться, да? Однако, на выходе стал получать "1861,2 __ 1861,2 __ 2,273737E-13" ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2015, 15:48 |
|
VBA, вычитание с неправильным результутом (ms access)
|
|||
---|---|---|---|
#18+
SAURONoffТот же (второй) код, но объявление заменил на "Dim temp3, temp4, temp5, temp6, temp7 As Single". Ничего ведь не должно было измениться, да?должно, это разные определения, читаем справку по Dim SAURONoffдва одинаковых числа при сравнении оказывались разнымичисла с правающей точкой неточные по определению. Корректно сравнивать их с допустимой точностью, например вместо Код: vbnet 1.
надо Код: vbnet 1.
Второй вариант - использовать округления. В любом случае ноль в Single и Double не равны целому нулю. Учим матчасть по числам с плавающей точкой (запятой) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2015, 16:01 |
|
VBA, вычитание с неправильным результутом (ms access)
|
|||
---|---|---|---|
#18+
SAURONoffс дробными числами (чертовы копейки )не надо вообще использовать Single для денежных величин. Деньги точность любят ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2015, 16:03 |
|
VBA, вычитание с неправильным результутом (ms access)
|
|||
---|---|---|---|
#18+
SAURONoff, автор два одинаковых числа при сравнении оказывались разными Single (как и Double) - это "не точные" (approximate) типы данных Нужно использовать Currency авторТот же (второй) код, но объявление заменил на "Dim temp3, temp4, temp5, temp6, temp7 As Single". Ничего ведь не должно было измениться, да? Нет. Теперь переменные temp3, temp4, temp5, temp6 объявленны с типом Variant , а не Single ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2015, 16:06 |
|
VBA, вычитание с неправильным результутом (ms access)
|
|||
---|---|---|---|
#18+
CurrencyНужно использовать Currency --- Нет. Теперь переменные temp3, temp4, temp5, temp6 объявленны с типом Variant , а не Single Но... MSDN... https://msdn.microsoft.com/ru-ru/library/7ee5a7s1.aspx "Объявление нескольких переменных" Код: vbnet 1. 2.
И https://msdn.microsoft.com/ru-ru/library/47zceaw7.aspx - никакого Currency... Впрочем, поменял на Currency - вроде, работает... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2015, 16:14 |
|
VBA, вычитание с неправильным результутом (ms access)
|
|||
---|---|---|---|
#18+
Понятно. Visual Basic в Visual Studio и Visual Basic в офисе в некоторых вещах отличаются. В том числе, DIM работает по-разному. Спасибо всем! ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2015, 16:21 |
|
VBA, вычитание с неправильным результутом (ms access)
|
|||
---|---|---|---|
#18+
SAURONoff, 1) почитайте хоть какую-нибудь литературу (конспекты лекций) по форматам чисел с плавающей запятой (стандарт IEEE 754) и вычислительной математике; 2) не сравнивайте на равенство или не равенство числа с плавающей запятой; 2а) помните, что формат представления числа (человеку) - десятичный, в то время как хранения в большинстве случаев (машинный) - двоичный; 2б) на форуме есть ФАК по Access, см. Q19; 3) не используйте Single для хранения денежных сумм, и почитайте справку по диапазону значений и точности; используйте Currency или (Variant подтипа) Decimal ("Действительное" в конструкторе таблиц русской версии Access); >"Dim temp3, temp4, temp5, temp6, temp7 As Single". Ничего ведь не должно было измениться, да? Нет.справка по Dim StatementIf you don't specify a data type or object type, and there is no Deftype statement in the module, the variable is Variant by default.Ну, и TypeName() для проверки. P. S. Не знаю, стоит ли поздравлять с этим, но список граблей просто образцово-показательный. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2015, 16:27 |
|
VBA, вычитание с неправильным результутом (ms access)
|
|||
---|---|---|---|
#18+
"нет, я не тормоз" :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2015, 16:29 |
|
VBA, вычитание с неправильным результутом (ms access)
|
|||
---|---|---|---|
#18+
Shocker.ProВ любом случае ноль в Single и Double не равны целому нулю.Равны. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2015, 16:31 |
|
VBA, вычитание с неправильным результутом (ms access)
|
|||
---|---|---|---|
#18+
13-й кварталсписок граблей просто образцово-показательный.ты забыл еще одни классические граблиSAURONoffНо... MSDN... https://msdn.microsoft.com/ru-ru/library/7ee5a7s1.aspx "Объявление нескольких переменных"Автор не различает Visual Basic и VB.NET. Это два несовместимый языка и синтаксис у них разный. И вообще, зачем было лезть в MSDN, когда всего-то надо было нажать F1 SAURONoffVisual Basic в Visual Studio и Visual Basic в офисе в некоторых вещах отличаютсяVisual Basic в Visual Studio до 6.0 включительно (а также VBA в офисе) и Visual Basic .NET в Visual Studio .NET не просто в некоторых вещах отличаются, а это вообще разные языки) 13-й кварталShocker.ProВ любом случае ноль в Single и Double не равны целому нулю.Равны.я имел ввиду вычисленный, как в примере автора. "Чиcтый" ноль - таки да, равен )) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2015, 17:41 |
|
|
start [/forum/topic.php?fid=60&msg=38881959&tid=2156024]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 142ms |
0 / 0 |