powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / No FLOAT… DOUBLE only & ROUND
3 сообщений из 3, страница 1 из 1
No FLOAT… DOUBLE only & ROUND
    #32555811
olol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу поделиться… и т.д и т.п.

Я использую в таблицах только DOUBLE…
Если использовать FLOAT для простых чисел (например, коэффициент 0.5),
То вроде бы большой точности после запятой и не надо, но когда умножаешь на него DOUBLE, то получаешь ‘свинью’ в виде округления. И даже если это учесть в расчете, то могут быть проблемы с формированием отчетов. Например: Crystal Reports и QReport считают все итоги в DOUBLE.

При расчетах дробных чисел иногда вылазит длинный хвост от округления…
Причем не только при умножении/делении, а даже при простом сложении…

Вроде просто: A + B + C = C + B + A
Но не для дробных чисел…

Все дроби хранятся с плавающей запятой и обеспечивают необходимое количество ДЕЙСТВУЮЩИХ знаков... (а не после запятой)

Для простоты возьмем - ограничение в ТРИ знака и посмотрим, что получится:

Три числа: 1.05, 1.05 и 10.1

1.05 + 1.05 = 2.1
2.1 + 10.1 = 12.2

10.1 + 1.05 = 11.2 (округление третьего знака)
11.2 + 1.05 = 12,3 (округление третьего знака)

Итог получится разный, даже если не округлять, а отбрасывать…

Для сложения и вычитания, я использую процедурки с округлением…
Вроде таких проблем не замечал… Может кому пригодится...
В качестве n – 10, 100… или 60, 120… (для времени)

Кусочек SQL:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 /*--- 17.02.2004 -----------------------------------------------*/ 
 /*DROP PROCEDURE peAdd2n;*/ 
SET TERM ^;
CREATE PROCEDURE peAdd2n (n INTEGER, f1 DOUBLE PRECISION, f2 DOUBLE PRECISION)
  RETURNS (f DOUBLE PRECISION)
  AS DECLARE VARIABLE i INTEGER;
  BEGIN
    IF (f1 IS NULL) THEN f1 =  0 ; IF (f2 IS NULL) THEN f2 =  0 ;
    i = (f1 + f2) * n; f = i; f = f / n;
  END ^
SET TERM ;^
 /*--- 17.02.2004 -----------------------------------------------*/ 
 /*DROP PROCEDURE peSub2n;*/ 
SET TERM ^;
CREATE PROCEDURE peSub2n (n INTEGER, f1 DOUBLE PRECISION, f2 DOUBLE PRECISION)
  RETURNS (f DOUBLE PRECISION)
  AS DECLARE VARIABLE i INTEGER;
  BEGIN
    IF (f1 IS NULL) THEN f1 =  0 ; IF (f2 IS NULL) THEN f2 =  0 ;
    i = (f1 - f2) * n; f = i; f = f / n;
  END ^
SET TERM ;^

Успехов ВАМ… Дерзайте…
zow@temz.tomsk.ru
...
Рейтинг: 0 / 0
No FLOAT… DOUBLE only & ROUND
    #32555849
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо!

// для оформления текстов программ используйте тег [SRC][/SRC] вокруг текста
...
Рейтинг: 0 / 0
No FLOAT… DOUBLE only & ROUND
    #32555872
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Успехов ВАМ…

Спасибо.

>Дерзайте…

Дерзаю, и утверждаю, что проблемы надуманны !

...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / No FLOAT… DOUBLE only & ROUND
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]