Округление Accessa

24.05.2008
8
0
#1
Всем привет!!! Помогите уже незнаю что делать, есть база в аксесе 2003, доступ к ней осуществляю через делфи, так вот есть в БД поле с плавающей запятой, когда ввожу 0,13 она выдаёт 0,12999898755 и дополнительную чепуху в таком роде, как сделать так чтобы при в воде дробных чисел оно таким и оставалась например ввожу 5,36 оно и останется 5,36, а не 5,35998889989
в аксесе все типы перепробывал фиксированные, с числом десятичных знаков ничего непомает.
 

sinkopa

Well-Known Member
17.06.2009
344
9
#2
Всем привет!!! Помогите уже незнаю что делать, есть база в аксесе 2003, доступ к ней осуществляю через делфи, так вот есть в БД поле с плавающей запятой, когда ввожу 0,13 она выдаёт 0,12999898755 и дополнительную чепуху в таком роде, как сделать так чтобы при в воде дробных чисел оно таким и оставалась например ввожу 5,36 оно и останется 5,36, а не 5,35998889989
в аксесе все типы перепробывал фиксированные, с числом десятичных знаков ничего непомает.
Это не бага... это фича... :)
ну... если не нравится... можно не юзать тип FLOAT...
Выдержка из мануала:
Структурированный язык манипулирования данными SQL
Типы данных SQL
...
Типы данных SQL с плавающей точкой (дробные числа) и целые числа
Типы данных SQL Описание
TINYINT(size) Может хранить числа от -128 до 127
SMALLINT(size) Диапазон от -32 768 до 32 767
MEDIUMINT(size) Диапазон от -8 388 608 до 8 388 607
INT(size) Диапазон от -2 147 483 648 до 2 147 483 647
BIGINT(size) Диапазон от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807

FLOAT(size,d) Число с плавающей точкой небольшой точности.
DOUBLE(size,d) Число с плавающей точкой двойной точности.
DECIMAL(size,d) Дробное число, хранящееся в виде строки.
...
 

sinkopa

Well-Known Member
17.06.2009
344
9
#5
Ну... как Вам по проще объяснить то...
Тип данных "double, с плавающей точкой" по жизни неточный тип данных, там нет какой-то точности...
Для хранения double (диапазон от –1,797*10308 до 1,797*10308) Access выделяет 8 байт памяти.
Фактически Access ничего не знает про вашу запятую... ему просто некуда ее поставит (записать, сохранить)...
вместо этого он к вашему числу (на входе) применяет некую... скажем так, формулу... в результате которой получается некое целое число...
Вот это число как раз и ложится в отведенную память.
Затем, когда вы запросом "вынимаете" это число из "хранилища", Access применяет "формулу обратного преобразования" и выдает вам результат очень похожий на исходное дробное число...
При этом "типа точность" гарантирована в пределах количества знаков после запятой, указанных в свойствах конкретного поля таблицы базы данных...
Не понятно объясняю? Спросите у гугла по словам "работа с числами с плавающей точкой" и "дискретная математика"

Варианты на тему "а что же делать то?"
Первый:
1) тип поля БД не меняем, в его свойствах выставляем (кол-во знаков после запятой = 2)
2) Перед тем как положить туда дробное число (к примеру 0,13 ), "поганим" его сами.
Код:
a := 0.13;
a := a + 0.00000000000001;
Второй (если все расчеты у Вас происходят в Delphi а база Access только для запросов репорта):
1) тип поля БД меняем на Текстовый
2) Перед тем как положить туда данные, приводим дробное число к строке.

Третий (если база Access только для хранения данных а выборка и отображение происходят через Delphi)
1) тип поля БД меняем на Длинное целое
2) Перед тем как положить туда данные, приводим дробное число к целому.
Код:
a := 0.13;
b := Trunc(a*100);
Также можно данному полю назначить тип "Мастер подстановок" и записывать туда формулу обеспечивающую необходимую вам точность отображения данных... Но это уже вам в документацию по Access...
 

V88

Well-Known Member
22.10.2008
51
0
#6
Можно также попробовать сделать в Аксесе тип Целый с числом знаков после запятой 2 и в дельфи использовать функцию напр из едита FloatToStrF(Edtit1.Text,ffNumber,2)... Вроде как-то так...