C# (56 chars):
My quick and naive answer earlier had a stupid logical flaw in it. Two approaches here, which I believe are both the same length. Double approach relies on the fact that casting to int removes the decimal part of a double.
int F(double d){return(int)(d%1==0?d:(int)d-(d<0?1:0));}
int F(double d){return(int)(d%1==0?d:(int)d-(d<0?1:0));}
Decimal approach relies on the fact that d%1 returns the decimal part of the number for decimal data type.
int F(decimal d){return(int)(d%1==0?d:d-d%1-(d<0?1:0));}
int F(decimal d){return(int)(d%1==0?d:d-d%1-(d<0?1:0));}
Could save a few characters in both cases by returning their own type instead of int, but I feel a floor function should return an int.