ник: Анатолий (Киев)
Тема стара, как мир. Вам надо знать следующее:
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 (Действительное).