Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
92c5ab40
Commit
92c5ab40
authored
Dec 02, 2014
by
antirez
Browse files
Use exp format and more precision output for ZSCAN.
Ref: issue #2175
parent
5bd3b9d9
Changes
5
Hide whitespace changes
Inline
Side-by-side
src/db.c
View file @
92c5ab40
...
...
@@ -381,7 +381,7 @@ void scanCallback(void *privdata, const dictEntry *de) {
}
else
if
(
o
->
type
==
REDIS_ZSET
)
{
key
=
dictGetKey
(
de
);
incrRefCount
(
key
);
val
=
createStringObjectFromLongDouble
(
*
(
double
*
)
dictGetVal
(
de
));
val
=
createStringObjectFromLongDouble
(
*
(
double
*
)
dictGetVal
(
de
)
,
0
);
}
else
{
redisPanic
(
"Type not handled in SCAN callback."
);
}
...
...
src/object.c
View file @
92c5ab40
...
...
@@ -109,9 +109,11 @@ robj *createStringObjectFromLongLong(long long value) {
return
o
;
}
/* Note: this function is defined into object.c since here it is where it
* belongs but it is actually designed to be used just for INCRBYFLOAT */
robj
*
createStringObjectFromLongDouble
(
long
double
value
)
{
/* Create a string object from a long double. If humanfriendly is non-zero
* it does not use exponential format and trims trailing zeroes at the end,
* however this result in loss of precision. Otherwise exp format is used
* and the output of snprintf() is not modified. */
robj
*
createStringObjectFromLongDouble
(
long
double
value
,
int
humanfriendly
)
{
char
buf
[
256
];
int
len
;
...
...
@@ -120,15 +122,19 @@ robj *createStringObjectFromLongDouble(long double value) {
* that is "non surprising" for the user (that is, most small decimal
* numbers will be represented in a way that when converted back into
* a string are exactly the same as what the user typed.) */
len
=
snprintf
(
buf
,
sizeof
(
buf
),
"%.17Lf"
,
value
);
/* Now remove trailing zeroes after the '.' */
if
(
strchr
(
buf
,
'.'
)
!=
NULL
)
{
char
*
p
=
buf
+
len
-
1
;
while
(
*
p
==
'0'
)
{
p
--
;
len
--
;
if
(
humanfriendly
)
{
len
=
snprintf
(
buf
,
sizeof
(
buf
),
"%.17Lf"
,
value
);
/* Now remove trailing zeroes after the '.' */
if
(
strchr
(
buf
,
'.'
)
!=
NULL
)
{
char
*
p
=
buf
+
len
-
1
;
while
(
*
p
==
'0'
)
{
p
--
;
len
--
;
}
if
(
*
p
==
'.'
)
len
--
;
}
if
(
*
p
==
'.'
)
len
--
;
}
else
{
len
=
snprintf
(
buf
,
sizeof
(
buf
),
"%.17Lg"
,
value
);
}
return
createStringObject
(
buf
,
len
);
}
...
...
src/redis.h
View file @
92c5ab40
...
...
@@ -1116,7 +1116,7 @@ robj *tryObjectEncoding(robj *o);
robj
*
getDecodedObject
(
robj
*
o
);
size_t
stringObjectLen
(
robj
*
o
);
robj
*
createStringObjectFromLongLong
(
long
long
value
);
robj
*
createStringObjectFromLongDouble
(
long
double
value
);
robj
*
createStringObjectFromLongDouble
(
long
double
value
,
int
humanfriendly
);
robj
*
createListObject
(
void
);
robj
*
createZiplistObject
(
void
);
robj
*
createSetObject
(
void
);
...
...
src/t_hash.c
View file @
92c5ab40
...
...
@@ -565,7 +565,7 @@ void hincrbyfloatCommand(redisClient *c) {
}
value
+=
incr
;
new
=
createStringObjectFromLongDouble
(
value
);
new
=
createStringObjectFromLongDouble
(
value
,
1
);
hashTypeTryObjectEncoding
(
o
,
&
c
->
argv
[
2
],
NULL
);
hashTypeSet
(
o
,
c
->
argv
[
2
],
new
);
addReplyBulk
(
c
,
new
);
...
...
src/t_string.c
View file @
92c5ab40
...
...
@@ -397,7 +397,7 @@ void incrbyfloatCommand(redisClient *c) {
addReplyError
(
c
,
"increment would produce NaN or Infinity"
);
return
;
}
new
=
createStringObjectFromLongDouble
(
value
);
new
=
createStringObjectFromLongDouble
(
value
,
1
);
if
(
o
)
dbOverwrite
(
c
->
db
,
c
->
argv
[
1
],
new
);
else
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment