Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Акс и математика?
 
 автор: kot_k_k   (15.09.2009 в 10:26)   личное сообщение
15 Кб.
 
 

Почему так?

Для Акса: 7,67 -получено из поля таблицы с плав точкой.

7,67 / 7,85 = 0,977070073413241

но если задать тупо

7,67 / 7,85 = 0,977070063694268

на рисунке часть отладчика

но самый финт получается если значение поля = 7,85
то 7,85 / 7,85 равно 0,999999987851283 а не 1, хотя при проверке !поле=7,85 говорит ДА!
вот такая блин музыка.

  Ответить  
 
 автор: Анатолий (Киев)   (15.09.2009 в 12:06)   личное сообщение
 
 

Тема стара, как мир. Вам надо знать следующее:
1. Числовые поля типа Double и, особенно, Single не обеспечивают точное представление дробных и больших целых чисел;
2. При арифметических вычислениях между числовыми переменными различного типа результат приводится к максимально точному из участвующих типов, способных его принять;
3. При явом указании в выражении целого числа его тип приводится к Integer, а дробного - к Double;
4. В логических операциях тип обоих операндов приводится к более точному из них, подходящему для обоих значений.

Вот, что получилось в окне отладки:

?7.67/7.85 'Double/Double Это ваше "если задать тупо"
 0.977070063694268 
?CDbl(7.67)/Cdbl(7.85) 'То же
 0.977070063694268 
?CSng(7.67)/7.85 'Single/Double Результат - Double, но из-за Single точность хуже. Это ваше с полем.
 0.977070073413241 
?7.67/CSng(7.85) 'Double/Single Результат - Double, но из-за Single точность хуже и результат другой
 0.977070075564416 'Single/Single Результат - Single, самый неточный
?CSng(7.67)/CSng(7.85)
 0.9770701
?CCur(7.67)/7.85 'Currency/Double Результат - Double, т.к. Currency не подходит для такого результата.
 0.977070063694268 
?CDec(7.67)/7.85 'Decimal/Double Результат - Decimal, самый точный.
 0.977070063694267515923566879 

Теперь одинаковые числа:

?7.85/7.85 'Double/Double
 1 
?CSng(7.85)/CSng(7.85) 'Single/Single
 1 
?CSng(7.85)/7.85 'Single/Double
 0.999999987851283 
?CSng(7.85)/CDbl(7.85) 'То же
 0.999999987851283 
?CSng(7.85)/CDec(7.85) 'Single/Decimal Результат - Decimal.
 1

У вас поле имеет тип Single, отсюда и уши. Если вам нужна вісокая точность вычислений, то или применяйте в вычислениях CDec(), или (рекомендую) измените тип поля(ей) на Decimal (Действительное).

  Ответить  
 
 автор: kot_k_k   (15.09.2009 в 12:23)   личное сообщение
 
 

Использовать CDec() -скорее всего выход, но мне кажется имеет место изначальная кривизна мелкософтовского продукта, т.к. еще на dBASE и Клиппере если задаешь 3 раздяда после запятой то и считает 3 разряда, и показывает 3 разряда и хранит теже 3 разряда, и функции округления ручками ненадо было писать.

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList