diff --git a/src/t_hash.c b/src/t_hash.c
index 7da8fb171..c75b391d7 100644
--- a/src/t_hash.c
+++ b/src/t_hash.c
@@ -596,23 +596,23 @@ void hincrbyCommand(client *c) {
 }
 
 void hincrbyfloatCommand(client *c) {
-    double value, incr;
+    long double value, incr;
     long long ll;
     robj *o;
     sds new;
     unsigned char *vstr;
     unsigned int vlen;
 
-    if (getDoubleFromObjectOrReply(c,c->argv[3],&incr,NULL) != C_OK) return;
+    if (getLongDoubleFromObjectOrReply(c,c->argv[3],&incr,NULL) != C_OK) return;
     if ((o = hashTypeLookupWriteOrCreate(c,c->argv[1])) == NULL) return;
     if (hashTypeGetValue(o,c->argv[2]->ptr,&vstr,&vlen,&ll) == C_OK) {
         if (vstr) {
-            if (string2d((char*)vstr,vlen,&value) == 0) {
+            if (string2ld((char*)vstr,vlen,&value) == 0) {
                 addReplyError(c,"hash value is not a float");
                 return;
             }
         } else {
-            value = (double)ll;
+            value = (long double)ll;
         }
     } else {
         value = 0;
diff --git a/src/util.c b/src/util.c
index c734b1b6d..c1494e021 100644
--- a/src/util.c
+++ b/src/util.c
@@ -426,9 +426,9 @@ int string2l(const char *s, size_t slen, long *lval) {
  * Note that this function demands that the string strictly represents
  * a double: no spaces or other characters before or after the string
  * representing the number are accepted. */
-int string2d(const char *s, size_t slen, double *dp) {
+int string2ld(const char *s, size_t slen, long double *dp) {
     char buf[256];
-    double value;
+    long double value;
     char *eptr;
 
     if (slen >= sizeof(buf)) return 0;
@@ -436,7 +436,7 @@ int string2d(const char *s, size_t slen, double *dp) {
     buf[slen] = '\0';
 
     errno = 0;
-    value = strtod(buf, &eptr);
+    value = strtold(buf, &eptr);
     if (isspace(buf[0]) || eptr[0] != '\0' ||
         (errno == ERANGE &&
             (value == HUGE_VAL || value == -HUGE_VAL || value == 0)) ||
diff --git a/src/util.h b/src/util.h
index d28049eaf..d7784495b 100644
--- a/src/util.h
+++ b/src/util.h
@@ -41,7 +41,7 @@ uint32_t sdigits10(int64_t v);
 int ll2string(char *s, size_t len, long long value);
 int string2ll(const char *s, size_t slen, long long *value);
 int string2l(const char *s, size_t slen, long *value);
-int string2d(const char *s, size_t slen, double *dp);
+int string2ld(const char *s, size_t slen, long double *dp);
 int d2string(char *buf, size_t len, double value);
 int ld2string(char *buf, size_t len, long double value, int humanfriendly);
 sds getAbsolutePath(char *filename);