diff --git a/sql/field.cc b/sql/field.cc
index b70e2a92618ae3da775ca3a97d7f1eac1d025417..6de2a7310305bd68b5f73b357c050e139483a908 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -3953,7 +3953,7 @@ longlong Field_float::val_int(void)
   else
 #endif
     memcpy_fixed((byte*) &j,ptr,sizeof(j));
-  return ((longlong) j);
+  return (longlong) rint(j);
 }
 
 
@@ -4241,7 +4241,7 @@ longlong Field_double::val_int(void)
   else
 #endif
     doubleget(j,ptr);
-  return ((longlong) j);
+  return (longlong) rint(j);
 }
 
 
diff --git a/sql/item.h b/sql/item.h
index 3c03cd23e2c34723beba2ffe1e0137f02872af35..718b995bc5ac25a1089ad92d45ebacd0bf11d8a2 100644
--- a/sql/item.h
+++ b/sql/item.h
@@ -159,7 +159,7 @@ struct Hybrid_type_traits
   { val->real/= ulonglong2double(u); }
 
   virtual longlong val_int(Hybrid_type *val, bool unsigned_flag) const
-  { return (longlong) val->real; }
+  { return (longlong) rint(val->real); }
   virtual double val_real(Hybrid_type *val) const { return val->real; }
   virtual my_decimal *val_decimal(Hybrid_type *val, my_decimal *buf) const;
   virtual String *val_str(Hybrid_type *val, String *buf, uint8 decimals) const;
@@ -1341,7 +1341,7 @@ class Item_float :public Item_num
     {
       return LONGLONG_MAX;
     }
-    return (longlong) (value+(value > 0 ? 0.5 : -0.5));
+    return (longlong) rint(value);
   }
   String *val_str(String*);
   my_decimal *val_decimal(my_decimal *);