@@ -2,6 +2,7 @@ package miniredis
22
33import (
44 "errors"
5+ "math/big"
56 "sort"
67 "strconv"
78 "time"
@@ -164,17 +165,18 @@ func (db *RedisDB) stringIncr(k string, delta int) (int, error) {
164165}
165166
166167// change float key value
167- func (db * RedisDB ) stringIncrfloat (k string , delta float64 ) (float64 , error ) {
168- v := 0.0
168+ func (db * RedisDB ) stringIncrfloat (k string , delta * big.Float ) (* big.Float , error ) {
169+ v := big .NewFloat (0.0 )
170+ v .SetPrec (128 )
169171 if sv , ok := db .stringKeys [k ]; ok {
170172 var err error
171- v , err = strconv .ParseFloat (sv , 64 )
173+ v , _ , err = big .ParseFloat (sv , 10 , 128 , 0 )
172174 if err != nil {
173- return 0 , ErrFloatValueError
175+ return nil , ErrFloatValueError
174176 }
175177 }
176- v += delta
177- db .stringSet (k , formatFloat (v ))
178+ v . Add ( v , delta )
179+ db .stringSet (k , formatBig (v ))
178180 return v , nil
179181}
180182
@@ -346,19 +348,20 @@ func (db *RedisDB) hashIncr(key, field string, delta int) (int, error) {
346348}
347349
348350// hashIncrfloat changes float key value
349- func (db * RedisDB ) hashIncrfloat (key , field string , delta float64 ) (float64 , error ) {
350- v := 0.0
351+ func (db * RedisDB ) hashIncrfloat (key , field string , delta * big.Float ) (* big.Float , error ) {
352+ v := big .NewFloat (0.0 )
353+ v .SetPrec (128 )
351354 if h , ok := db .hashKeys [key ]; ok {
352355 if f , ok := h [field ]; ok {
353356 var err error
354- v , err = strconv .ParseFloat (f , 64 )
357+ v , _ , err = big .ParseFloat (f , 10 , 128 , 0 )
355358 if err != nil {
356- return 0 , ErrFloatValueError
359+ return nil , ErrFloatValueError
357360 }
358361 }
359362 }
360- v += delta
361- db .hashSet (key , field , formatFloat (v ))
363+ v . Add ( v , delta )
364+ db .hashSet (key , field , formatBig (v ))
362365 return v , nil
363366}
364367
0 commit comments