Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  14:28[Войти] | [Зарегистрироваться]
Ответ на вопрос № 65263

19-09-2008 07:25
Привет всем! столкнулся сегодня с интересным эффектом. Delphi 5.0. Build 6.18. Update Pack 1.
Мне нужно вычислить соотношение цены к весу.
Если соотношение Меньше или равно 1.8, то одни действия, если больше - другие.
PriceEUR = 45
Brutto = 25.
45/25 = 1.8

Но не все так просто :(
Вот код:

if RoundTo(PriceEUR/Brutto + 0.00001, -1) <= 1.8 then
  TamCode[10]:='1'
else
  TamCode[10]:='9';

Округления разные пробовал. всегда идет в ветку else.
К сожалению, нельзя прикрепить картинку к посту, привел бы скриншот.
А так в Watches видим следующее:
RoundTo(PriceEUR/Brutto - 0.00001, -1): 1.8
RoundTo(PriceEUR/Brutto - 0.00001, -1) = 1.8: False

Весьма странное на мой взшляд поведение.
Почему так получается и что делать? Спасибо :)

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

22-09-2008 08:55 | Комментарий к предыдущим ответам
>>> вот и верь после этого RoundTo :)
Да ладно RoundTo. Отладчик тоже хорош :)

22-09-2008 03:41 | Комментарий к предыдущим ответам
Я бы рекомендовал воспользоваться модулем DecimalRoundExt от John Herbster: http://cc.codegear.com/Item.aspx?id=21909
P.S. Если я не ошибся, то что-то из этого вошло в D2009 как замена старым функциям: http://dn.codegear.com/article/38714 (отчёт #8143).

22-09-2008 03:11
вот и верь после этого RoundTo :)

Дык, когда речь идёт о вещественных числах, даже оператору присваивания верить нельзя :)

Попробуйте этот код

var
  X: Double;
begin
  X := 1.8;
  if X = 1.8 then
    ShowMessage('Равно')
  else
    ShowMessage('Не равно')
end;


22-09-2008 02:58 | Сообщение от автора вопроса
вот и верь после этого RoundTo :)

22-09-2008 02:39 | Комментарий к предыдущим ответам
Интересно, что если переключить Watch в отладчике в Floating point вместо Default, то значение от RoundTo будет равно 1.80000000000000004, а не 1.8:

E := RoundTo(PriceEUR/Brutto + 0.00001, -1); // Default: 1.8; Floating Point: 1.80000000000000004; Memory dump: $00 $68 $66 $66 $66 $66 $66 $E6 $FF $3F
H := 1.8; // Default: 1.8; Floating Point: 1.8; Memory dump: $66 $66 $66 $66 $66 $66 $66 $E6 $FF $3F


22-09-2008 01:45 | Сообщение от автора вопроса
SameValue из Delphi 7 помогло, спасибо.

19-09-2008 13:23
>>>Заходил по шагам в функцию RoundTo. Получается 1.8 в результате... Ровно. а в if не равно :(

Раз в if не равно,значит не равно(раз доктор сказал в морг,значит в морг:).Как убедиться?
Заведите две переменные.Одной присвойте результат round'а а другой 1.8
в Watches посмотрите на них в шестнадцатиричном виде(HEX).

19-09-2008 08:48 | Комментарий к предыдущим ответам
Это вы меня так интеллигентно тормозом назвали
нет конечно, это в контексте других вопросов, прошу прощения...

19-09-2008 08:42 | Комментарий к предыдущим ответам
В догонку - Неочевидные особенности вещественных чисел

19-09-2008 08:31
Используй Math.SameValue при сравнении чисел.

19-09-2008 08:20 | Сообщение от автора вопроса
Это вы меня так интеллигентно тормозом назвали? ;)
Может я уже и не тороплюсь... Пятница, вечер и все такое.... :)
Но ведь получается четкое равенство. значение = 1.8, а в if имеем False при проверке на равенство.
Заходил по шагам в функцию RoundTo. Получается 1.8 в результате... Ровно. а в if не равно :(
Ладно, с понедельника на свежую голову буду разбираться, читать статьи и вникать :)
Спасибо.

19-09-2008 07:37 | Комментарий к предыдущим ответам
я не тормоз, я просто не тороплюсь ;-)

19-09-2008 07:36
Статью читали?

19-09-2008 07:34
Загадки округления

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Зимой — белый, летом — серый. Кто?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования