Skip to content

Commit 559e6dc

Browse files
authored
Merge pull request #116 from francoispqt/fix/decode-float32-10decimal
enable decoding of float32 when >= 10 decimal
2 parents c53b22c + 2c0efb7 commit 559e6dc

File tree

3 files changed

+16
-10
lines changed

3 files changed

+16
-10
lines changed

decode_number_float.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,7 @@ func (dec *Decoder) getFloat32() (float32, error) {
324324
continue
325325
case '.':
326326
// we get part before decimal as integer
327-
beforeDecimal := dec.atoi32(start, end)
327+
beforeDecimal := dec.atoi64(start, end)
328328
// then we get part after decimal as integer
329329
start = j + 1
330330
// get number after the decimal point
@@ -341,14 +341,14 @@ func (dec *Decoder) getFloat32() (float32, error) {
341341
continue
342342
} else if (c == 'e' || c == 'E') && j < i-1 {
343343
// we get the number before decimal
344-
var afterDecimal int32
344+
var afterDecimal int64
345345
expI := end - start + 2
346346
// if exp is too long, it means number is too long, just truncate the number
347347
if expI >= 12 || expI < 0 {
348348
expI = 10
349-
afterDecimal = dec.atoi32(start, start+expI-2)
349+
afterDecimal = dec.atoi64(start, start+expI-2)
350350
} else {
351-
afterDecimal = dec.atoi32(start, end)
351+
afterDecimal = dec.atoi64(start, end)
352352
}
353353
dec.cursor = i + 1
354354
pow := pow10uint64[expI]
@@ -377,23 +377,23 @@ func (dec *Decoder) getFloat32() (float32, error) {
377377
}
378378
// then we add both integers
379379
// then we divide the number by the power found
380-
var afterDecimal int32
380+
var afterDecimal int64
381381
expI := end - start + 2
382382
// if exp is too long, it means number is too long, just truncate the number
383383
if expI >= 12 || expI < 0 {
384384
expI = 10
385-
afterDecimal = dec.atoi32(start, start+expI-2)
385+
afterDecimal = dec.atoi64(start, start+expI-2)
386386
} else {
387387
// then we add both integers
388388
// then we divide the number by the power found
389-
afterDecimal = dec.atoi32(start, end)
389+
afterDecimal = dec.atoi64(start, end)
390390
}
391391
pow := pow10uint64[expI]
392392
return float32(beforeDecimal+afterDecimal) / float32(pow), nil
393393
case 'e', 'E':
394394
dec.cursor = j + 1
395395
// we get part before decimal as integer
396-
beforeDecimal := uint32(dec.atoi32(start, end))
396+
beforeDecimal := dec.atoi64(start, end)
397397
// get exponent
398398
exp, err := dec.getExponent()
399399
if err != nil {
@@ -410,12 +410,12 @@ func (dec *Decoder) getFloat32() (float32, error) {
410410
return float32(beforeDecimal) * float32(pow10uint64[pExp]), nil
411411
case ' ', '\n', '\t', '\r', ',', '}', ']': // does not have decimal
412412
dec.cursor = j
413-
return float32(dec.atoi32(start, end)), nil
413+
return float32(dec.atoi64(start, end)), nil
414414
}
415415
// invalid json we expect numbers, dot (single one), comma, or spaces
416416
return 0, dec.raiseInvalidJSONErr(dec.cursor)
417417
}
418-
return float32(dec.atoi32(start, end)), nil
418+
return float32(dec.atoi64(start, end)), nil
419419
}
420420

421421
// Add Values functions

decode_number_float_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -873,6 +873,11 @@ func TestDecoderFloat32(t *testing.T) {
873873
json: "-0.1234",
874874
expectedResult: -0.1234,
875875
},
876+
{
877+
name: "float10-digit-decimal",
878+
json: "0.9833984375",
879+
expectedResult: 0.9833984,
880+
},
876881
{
877882
name: "error",
878883
json: "83zez4",

decode_number_int.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1070,6 +1070,7 @@ func (dec *Decoder) atoi32(start, end int) int32 {
10701070
var ll = end + 1 - start
10711071
var val = int32(digits[dec.data[start]])
10721072
end = end + 1
1073+
10731074
// overflowing
10741075
if ll < maxInt32Length {
10751076
for i := start + 1; i < end; i++ {

0 commit comments

Comments
 (0)