我在程序中需要判断一个日期是否是一个月的最后一天,用
var:
 rq:tdate;
 year,month,day:word;
begin
 rq:=datetimepicker1.date;
 decodedate(year,month,day);
 if rq=encodedate(year,month+1,1)-1 then
  begin
  ....
程序中rq=encodedate(year,month+1,1)-1条件始终不能成立,但换成:
datetostr(rq)=datetostr(encodedate(year,month+1,1)-1)后能成立,why?

解决方案 »

  1.   

    因为日期类型是一个Double类型。对于两个Double类型通常是不能直接比较大小的。因为两个你认为相等的Double数相减并不是零,所以无法直接比较,因此,我们判断两个Double值相等是采用把这两个浮点值相减,如果差值小于一个预先设定的很小的值,那么我们就认为他相等。所以你上面的条件是成立不了的。因为减出来永远不是0。这个问题是由于机器的精度有限的问题。你转成字符串后当然没有这个问题了。
      

  2.   

    DayOfTheMonth
    可以实现你的要求
      

  3.   

    //by CoolSlob.
    //功能:取得指定年和月的最后一天。uses SysUtils;function GetEndDay(const iYear, iMonth: Integer): Byte;
    var
      DayTable: PDayTable;
    begin
      DayTable := @MonthDays[IsLeapYear(iYear)];
      Result := DayTable[iMonth];
    end;使用上面的函数,再与你的日期相比即可。