Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не правильно работает MonthsBetween [D7, WinXP]


Страницы:   1 2 3 4

kyn66 ©   (2009-02-06 11:42:00) 

Добрый день. Использую RX компонент function MonthsBetween(Date1, Date2: TDateTime): Double;
Впервые пришлось его применить . Однако после применения обнаружил неверно выдаваемые результаты. Вот оригинальная функция:

function MonthsBetween(Date1, Date2: TDateTime): Double;
var
 D, M, Y: Word;
begin
 DateDiff(Date1, Date2, D, M, Y);
 Result := 12 * Y + M;
 if (D > 1) and (D < 7) then Result := Result + 0.25
 else if (D >= 7) and (D < 15) then Result := Result + 0.5
 else if (D >= 15) and (D < 21) then Result := Result + 0.75
 else if (D >= 21) then Result := Result + 1;
end;


У меня разница в датах 22 дня. Т.е. по идее функция перемещается на строку else if (D >= 21) then Result := Result + 1; и получается на выходе 1. Т.е. разница в датах = 1 мес. Это в корне неверно. 22 дня и 2 мес. Почему так? В чем дело? Как лечить?


Anatoly Podgoretsky   (2009-02-06 16:06:00) [21]

> Sergey13  (06.02.2009 16:04:43)  [43]

А у нас перекуры по 31 минуты. Это ровно половина часа.


Sergey13   (2009-02-06 16:04:00) [22]

> [39] kyn66 ©   (06.02.09 15:52)

А вообще сопли какие то пошли. Не нравится функция - напиши свою. Там делов то на полчаса с перекуром.


Anatoly Podgoretsky   (2009-02-06 16:01:00) [23]

> Sergey13  (06.02.2009 15:59:40)  [40]

И в феврале тоже как повезет, вероятность 0,75


Anatoly Podgoretsky   (2009-02-06 16:00:00) [24]

> kyn66  (06.02.2009 15:52:39)  [39]

Ты продолжаешь удивлять, у тебя в месяце 4 недели, но при этом 30 дней, осталось узнать, а сколько у тебя в году месяцев и дней.


Sergey13   (2009-02-06 15:59:00) [25]

> [39] kyn66 ©   (06.02.09 15:52)
> А почемц именно 0.25? Да потому, что в месяце 4 недели.

Кто тебе сказал? Это в феврале только. В январе 4 недели и 3 дня. А 3 дня это уже половина недели почти.

> Она должна мне реально сказать

Т.е. ты автору заплатил, дал задание, он написал а она не говорит? Безобразие. Я вот тоже хотел MP3 файл на слова порезать, а WORD мне этого не смог сделать. Мелкомягким что ли нажаловаться?

> Просто в этой функции решили совместить двойной ответ.
Решили потому, что так АВТОРАМ было нужно.

> Только зачем недели прикрутили?
Это твои домыслы.

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


kyn66   (2009-02-06 15:52:00) [26]


> Ну например, могу ли я внести платеж по кредиту не 10 (как
> в договоре например), а 5 числа или 15? Данная функция вполне
> резонно ответит что могу. Так как разница между этими числами
> и номинальным числом платежа практически нулевая, т.е. <7

Не совсем уместныйй пример и причем здесь фигурирует число 7? Кредит когда хочу - тогда и вношу, конечно стараюсь в срок. А кто нибудь сделал акцент на то, почему у функции MonthsBetween на выходе не Integer, а Double? Целая часть результата составляет число полных месяцев между двумя датами, дробная часть вычисляется с точностью до 0.25, то есть до недели.А почемц именно 0.25? Да потому, что в месяце 4 недели.

Если у меня разница в днях 22. Так почему-же функция мне не выдает на выходе дробное число, типа 0.68 , а 1. Я еще раз говорю, причем здесь округление?

Она должна мне реально сказать, что ваше число 22 меньше , чем 30(примем за кол-во дней в месяце) , на выходе 0.68. А так как я сравниваю выходное значение функции с 1(месяц), то убеждаюсь, что моя разница меньше месяца. Ну и что тут сложного? Зачем в дебри логарифмические лезть?


> номинальным числом платежа практически нулевая, т.е. <7.
>  Что тут нелогичного?

А почему не 8, не 9, не 10???

Просто в этой функции решили совместить двойной ответ. Только зачем недели прикрутили? .... Может кому и надо. Иногда название функции в большей мере отвечает за свое назначение. Поэтому в первую очередь ее и рассматриваешь.


Anatoly Podgoretsky   (2009-02-06 15:50:00) [27]

> Ega23  (06.02.2009 15:48:36)  [36]

Пятница и тяжелое прошлое.


Johnmen   (2009-02-06 15:50:00) [28]


> А это уж, извени , не тебе судить и решать.

Конечно не мне! Я и не решаю, а даю совет, как избежать того, когда тебе станет мучительно больно.
Следовать моим, или чьим бы то ни было советам, вовсе не обязательно. Но кто внемлет, то предупрежден, а значит вооружен...


Ega23   (2009-02-06 15:48:00) [29]

И обижаешься ты зря. Тебе пытаются объяснить, что то определение, которое ты пытаешься вытащить - оно бессмысленно. Точнее, вполне возможно, что оно тебе для каких-то нужд и нужно, но само по себе оно, как ты его себе представляешь, в корне не верно.
А ты как баран упёрся и понять не желаешь.


Ega23   (2009-02-06 15:45:00) [30]


> Это исключение. Вопрос в принципе.


Да пойми ты одну простую вещь: понятие "месяц назад" или "через месяц" зависит от текущей даты (про всякие сдвиги по времени, часовые пояса, различные "летоисчисления" я сейчас вообще молчу).
Сегодня у нас 6 февраля. "Месяц" назад, например, было 6 января. Прошёл 31 день.
Через "месяц" будет 6 марта. Пройдёт 28 дней. А если ещё точнее, то пройдёт 27 дней, 8 часов и 15 минут, т.к. я не строго в полночь спрашиваю.


kyn66   (2009-02-06 15:33:00) [31]


> Легко, если это февраль.

Это исключение. Вопрос в принципе.


> Но НИКОГДА не претендуй на профессию программиста. И на
> другие, связанные с элементарной логикой и математикой,
> тоже.

А это уж, извени , не тебе судить и решать. Повторюсь, форум - это то место где "не очень умные" спрашивают советы у "очень цмных", особенно в данной ветке. Т.ч.....


Anatoly Podgoretsky   (2009-02-06 15:32:00) [32]

> Sergey13  (06.02.2009 15:23:32)  [32]

Дурные бухгалтера считают в месяцах, а умные в сутках и никогда не ошибатся, поскольку 30 дней они и в Африке 30 дней.


Sergey13   (2009-02-06 15:23:00) [33]

> [24] kyn66 ©   (06.02.09 15:04)
> да возьми любое числ > 21 и < 30 уже получишь на выходе 1. Ну и как это можно считать месяцем?

1. 28 и 29 вполне реально соответствуют месяцу.
2. Я ж тебе говорю, что в военное время косинус 45 градусов может доходить до 3-х. 8-)
3. Ну например, могу ли я внести платеж по кредиту не 10 (как в договоре например), а 5 числа или 15? Данная функция вполне резонно ответит что могу. Так как разница между этими числами и номинальным числом платежа практически нулевая, т.е. <7. Что тут нелогичного? Значит функция правильная.


Jeer   (2009-02-06 15:21:00) [34]


> Т.к. нет абсолютно чёткого понимания, что такое "месяц".


А если сюда еще подключить ОТО и СТО - а даже не представляю, чем все это закончится :)


Ega23   (2009-02-06 15:19:00) [35]


> Да мне не нужна точность до миллисекунд. Просто нужно было
> знать разницу в датах и перевалила-ли разница за месяц и
> только.


Блин. Ещё раз:
Перевалила ли разница в датах 01.01.2008 и 01.02.2008 (31 "сутки") за месяц?
Перевалила ли разница в датах 01.02.2008 и 01.03.2008 (29 "суток") за месяц?
Перевалила ли разница в датах 01.02.2009 и 01.03.2009 (28 "суток") за месяц?
Перевалила ли разница в датах 17.02.2009 и 17.03.2009 (28 "суток") за месяц?

Ты пойми, чёткого алгоритма нет. Т.к. нет абсолютно чёткого понимания, что такое "месяц".


Jeer   (2009-02-06 15:17:00) [36]


> и решаем ее вместе,


Мы ее не решаем, поверь, она давно решена в той или иной постановке.
Здесь тебе подсказывают корень твоих заблуждений, как в постановке вопроса, так и в использовании недопонятой тобой реализации такой функции.


Johnmen   (2009-02-06 15:15:00) [37]


> да возьми любое числ > 21 и < 30 уже получишь на выходе
> 1. Ну и как это можно считать месяцем?

Легко, если это февраль.

ЗЫ
Короче, персонально для тебя поднятая тема очень заумна. Поэтому считай, что месяц=30 и живи спокойно. Но НИКОГДА не претендуй на профессию программиста. И на другие, связанные с элементарной логикой и математикой, тоже.
Это не наезд, а добрый совет по жизни...


Jeer   (2009-02-06 15:14:00) [38]

Что же касается твоих претензий к данной реализации - твоим потокомыслям хан_малигн придал правильное направление ( нечеткая логика )

Добавлю англоязычное звучание, если с русским плохо - Fuzzi logic

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


kyn66   (2009-02-06 15:12:00) [39]

Прблема моя и решаем ее вместе, за что и благодарен этому сайту и всем мастерам, которые здесь обитают.


Jeer   (2009-02-06 15:10:00) [40]


> Да мне не нужна точность до миллисекунд


Тебе.


> Да.... это или очень заумно


Но это ведь не наша проблема, а твоя ?


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо