|
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 говорит ДА!
вот такая блин музыка.
| |
|
| |
|
|
|
| Тема стара, как мир. Вам надо знать следующее:
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 (Действительное). | |
|
| |
|
|
|
| Использовать CDec() -скорее всего выход, но мне кажется имеет место изначальная кривизна мелкософтовского продукта, т.к. еще на dBASE и Клиппере если задаешь 3 раздяда после запятой то и считает 3 разряда, и показывает 3 разряда и хранит теже 3 разряда, и функции округления ручками ненадо было писать.
| |
|
| |