![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка округления Trunc [D6, WinXP]
_Даня © (2007-08-17 14:33:00)Не первый раз отлавливаю ошибку округления Trunc, например:
Trunc(Form.Query1.FieldByName('Y').AsFloat * 100)
При открытом НД возвращает 43068, хотя в базе хранится значение 430.69
С базой это не связано, тоже самое происходит и со строковыми преобразованиями. Прямой вызов Trunc(43069.0) дает правильный результат. Ошибка стойкая, разница всегда либо 1, либо -1 (на разных сочетаниях последних двух цифр). Дополнительной проверкой можно это дело пресечь, но хотелось бы докопаться до причины. Никто не сталкивался? Спасибо, кто откликнется.
_Даня (2007-08-17 15:44:00) [1]
> Плохиш © (17.08.07 15:40) [5]
> > round и int как я понимаю работают аналогично trunc.К
> счастью фирму борланд незаботит чьё-то понимание и они описали
> работу этих функций в справке...
аналогично в свете статьи : http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=374
не буквально же
Плохиш (2007-08-17 15:40:00) [2]
> round и int как я понимаю работают аналогично trunc.
К счастью фирму борланд незаботит чьё-то понимание и они описали работу этих функций в справке...
_Даня (2007-08-17 15:29:00) [3]
> Плохиш © (17.08.07 15:01) [3]
> trunc - это не округление
Извиняюсь - оговорился.
> MBo © (17.08.07 14:45) [2]
Спасибо, очень интересная статья - проглядел, но надо посидеть, почитать внимательно и вдумчиво.
Но пока практический результат получить не удалось: SetRoundMode=rmUp дает правильный результат для положительных значений, очевидно rmDown (не проверял) - для отрицательных. Читаемые значения могут быть как положительными, так и отрицательными. Правильно ли я понимаю, что без дополнительной проверки получить правильно целочисленный результат из вещественного аргумента нельзя или есть другие способы? round и int как я понимаю работают аналогично trunc.
Плохиш (2007-08-17 15:01:00) [4]
> Не первый раз отлавливаю ошибку округления Trunc
Вообще-то trunc- это не округление, а обрезание того, что после запятой. А округление в пасклале и делфи всегда кликалось round.
MBo (2007-08-17 14:45:00) [5]430.69 * 100 < 43069 ввиду ограниченной точности представления чисел с плавающей запятой, так что никакой ошибки Trunc здесь нет
http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=374
Сергей М. (2007-08-17 14:37:00) [6]
> Ошибка стойкая, разница всегда либо 1, либо -1
см. SetRoundMode