Skip to content

Commit

Permalink
Merge pull request rsyslog#127 from jgerhards/i-126
Browse files Browse the repository at this point in the history
fix floating point representation
  • Loading branch information
rgerhards authored Nov 27, 2016
2 parents 337d2ca + d59b69d commit d07c5f6
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 1 deletion.
5 changes: 4 additions & 1 deletion json_object.c
Original file line number Diff line number Diff line change
Expand Up @@ -716,6 +716,7 @@ static int fjson_object_double_to_json_string(struct fjson_object* jso,
{
char buf[128], *p, *q;
int size;
double dummy; /* needed for modf() */
/* Although JSON RFC does not support
* NaN or Infinity as numeric values
* ECMA 262 section 9.8.1 defines
Expand All @@ -729,7 +730,9 @@ static int fjson_object_double_to_json_string(struct fjson_object* jso,
else
size = snprintf(buf, sizeof(buf), "-Infinity");
else
size = snprintf(buf, sizeof(buf), "%.17g", jso->o.c_double);
size = snprintf(buf, sizeof(buf),
(modf(jso->o.c_double, &dummy)==0)?"%.17g.0":"%.17g",
jso->o.c_double);

p = strchr(buf, ',');
if (p) {
Expand Down
2 changes: 2 additions & 0 deletions tests/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ AM_CFLAGS = $(WARN_CFLAGS)

TESTS=
TESTS+= ucs_copyright_char.test
TESTS+= test_float.test
TESTS+= test1.test
TESTS+= test2.test
TESTS+= test4.test
Expand Down Expand Up @@ -72,6 +73,7 @@ EXTRA_DIST += test2Formatted_pretty.expected
EXTRA_DIST += test2Formatted_spaced.expected
EXTRA_DIST += test4.expected
EXTRA_DIST += ucs_copyright_char.expected
EXTRA_DIST += test_float.expected
EXTRA_DIST += test_cast.expected
EXTRA_DIST += test_charcase.expected
EXTRA_DIST += test_locale.expected
Expand Down
24 changes: 24 additions & 0 deletions tests/test_float.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/* Copyright (C) 2016 by Rainer Gerhards
* Released under ASL 2.0 */
#include "config.h"
#include <stdio.h>
#include "../json_object.h"
#include "../json_tokener.h"
int main(void)
{
fjson_object *json;

json = fjson_object_new_double(1.0);
printf("json = %s\n", json_object_to_json_string_ext(json, JSON_C_TO_STRING_PRETTY));
json_object_put(json);
json = fjson_object_new_double(1.23);
printf("json = %s\n", json_object_to_json_string_ext(json, JSON_C_TO_STRING_PRETTY));
json_object_put(json);
json = fjson_object_new_double(123456789.0);
printf("json = %s\n", json_object_to_json_string_ext(json, JSON_C_TO_STRING_PRETTY));
json_object_put(json);
json = fjson_object_new_double(123456789.123);
printf("json = %s\n", json_object_to_json_string_ext(json, JSON_C_TO_STRING_PRETTY));
json_object_put(json);
return 0;
}
4 changes: 4 additions & 0 deletions tests/test_float.expected
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
json = 1.0
json = 1.23
json = 123456789.0
json = 123456789.123
12 changes: 12 additions & 0 deletions tests/test_float.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#!/bin/sh

# Common definitions
if test -z "$srcdir"; then
srcdir="${0%/*}"
test "$srcdir" = "$0" && srcdir=.
test -z "$srcdir" && srcdir=.
fi
. "$srcdir/test-defs.sh"

run_output_test test_float
exit $?

0 comments on commit d07c5f6

Please sign in to comment.