powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Округления DW Глюк или фича? PB 9.0.3 8836
8 сообщений из 8, страница 1 из 1
Округления DW Глюк или фича? PB 9.0.3 8836
    #35986399
Такой вот трабл с округлением

8.20 *(7.5 /100) = 0.615
round(8.20 *(7.5 /100),2)=0.61
round(0.615,2) =0.62

Тестовое DW приложено
Решение нашел через заднюю дверь

round(double(string(8.20 *(7.5 /100))),2)=0.62

И что - везде так писать теперь?



А мне надо с ККМ работать... А он сволочь-то правильно округляет как ни странно
...
Рейтинг: 0 / 0
Округления DW Глюк или фича? PB 9.0.3 8836
    #35986833
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может все-таки использовать truncate вместо round
-----------------------------------------------------------------------------
Главная деталь любой машины - голова ее владельца
...
Рейтинг: 0 / 0
Округления DW Глюк или фича? PB 9.0.3 8836
    #35986891
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spas2001Может все-таки использовать truncate вместо round
-----------------------------------------------------------------------------
Главная деталь любой машины - голова ее владельца
Нет, надо просто внимательно почитать как Datawindow Engine делает округление, datatype promotion, ну и про operator precedence тоже не помешает..
...
Рейтинг: 0 / 0
Округления DW Глюк или фича? PB 9.0.3 8836
    #35986918
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гриценко А.В.Такой вот трабл с округлением

8.20 *(7.5 /100) = 0.615
round(8.20 *(7.5 /100),2)=0.61
round(0.615,2) =0.62


Никакого трабла нету, вернее трабл конечно есть, но это поведение - не баг, а особенность работы с double в языках программирования.

Дело в том что для компьютера первое равенство неверно отсчета из-за погрешности преобразования между двоичной и десятичной системами при работе с double.
8.20 *(7.5 /100) дает 0.61499999999999988
А это при окрулении до 2 знаков действительно 0.61

У вас получилось 0.615 вероятно потому что при отображении результат неявно округлился до 3 или более знаков либо вы считали вручную :).

Что делать?

Ваше решение через string конечно выбросить - оно работает через побочные эффекты.

Правильное решение: все промежуточные результаты операций, видимые вне формулы, надо округлять до некоторого разумного числа знаков, например 4 (зависит от точности входных данных, для сумм это 4: разрядность копеек^2).
Например:
a) 8.20 *(7.5 /100) должно быть записано как round(8.20 *(7.5 /100), 4)
b) round(8.20 *(7.5 /100), 2) должно быть записано как round(round(8.20 *(7.5 /100), 4),2)
Т.е. (b) рассматривается как операция round(а, 2) . Поэтому имеет смысл так и оформить (a) в виде отдельного compute, а в (b) его использовать. Ну и естественно round(а, 2) нет смысла округлять до 4.

Вообще, правильно округлять вообще все промежуточные результаты, но на практике имеет смысл округлять только видимые(возвращаемые) значения.
...
Рейтинг: 0 / 0
Округления DW Глюк или фича? PB 9.0.3 8836
    #35986958
VanoR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
Дело в том что для компьютера первое равенство неверно отсчета из-за погрешности преобразования между двоичной и десятичной системами при работе с double.
8.20 *(7.5 /100) дает 0.61499999999999988
А это при окрулении до 2 знаков действительно 0.61

вот эт да!!!
я даж калькулятор на батарейках достал - 8.20 *(7.5 /100) получается 0.615 :)
и (7.5 /100)*8.20 тоже 0.615

если посмотреть его тестовую dw, то на самом деле - баг вроде
...
Рейтинг: 0 / 0
Округления DW Глюк или фича? PB 9.0.3 8836
    #35986963
VanoR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хотя round(round(8.20 *(7.5 /100), 4),2) прокатывает!!!?
о как!!
...
Рейтинг: 0 / 0
Округления DW Глюк или фича? PB 9.0.3 8836
    #35986968
VanoR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и при чем тут double?
в хелпе написано
автор Round DataWindow expression function
Return value
Decimal.
...
Рейтинг: 0 / 0
Округления DW Глюк или фича? PB 9.0.3 8836
    #35986981
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VanoRи при чем тут double?
в хелпе написано
автор Round DataWindow expression function
Return value
Decimal.
Погрешность возникает не в Round, а при вычислении выражения, поэтому какой тип возвращает или принимает Round - не важно.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Округления DW Глюк или фича? PB 9.0.3 8836
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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