diff --git a/src/util/FFstrbuf.c b/src/util/FFstrbuf.c index 7fc5fa87e..f0f85e61e 100644 --- a/src/util/FFstrbuf.c +++ b/src/util/FFstrbuf.c @@ -2,6 +2,7 @@ #include #include +#include char* CHAR_NULL_PTR = ""; @@ -577,9 +578,12 @@ void ffStrbufAppendDouble(FFstrbuf* strbuf, double value, int8_t precision) ffStrbufEnsureFree(strbuf, 40); // Required by yyjson_write_number char* start = strbuf->chars + strbuf->length; + if (precision == 0) + value = round(value); yyjson_val val = {}; unsafe_yyjson_set_double(&val, value); - if (precision >= 0) unsafe_yyjson_set_fp_to_fixed(&val, precision == 0 ? 1 : precision); // yyjson ignores precision == 0 + if (precision > 0) + unsafe_yyjson_set_fp_to_fixed(&val, precision); // Write at most digits after the decimal point; doesn't append trailing zeros char* end = yyjson_write_number(&val, start); diff --git a/tests/strbuf.c b/tests/strbuf.c index c7ac50fe5..39c845a3b 100644 --- a/tests/strbuf.c +++ b/tests/strbuf.c @@ -759,6 +759,14 @@ int main(void) ffStrbufAppendDouble(&strbuf, 120.123456789, 5); VERIFY(ffStrbufEqualS(&strbuf, "120.12346")); + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, 120.888888, 0); + VERIFY(ffStrbufEqualS(&strbuf, "121")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, 120.999999, 2); + VERIFY(ffStrbufEqualS(&strbuf, "121.00")); + ffStrbufClear(&strbuf); ffStrbufAppendDouble(&strbuf, 120.123456789, 0); VERIFY(ffStrbufEqualS(&strbuf, "120")); @@ -799,6 +807,14 @@ int main(void) ffStrbufAppendDouble(&strbuf, -120.123, 5); VERIFY(ffStrbufEqualS(&strbuf, "-120.12300")); + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, -120.888888, 0); + VERIFY(ffStrbufEqualS(&strbuf, "-121")); + + ffStrbufClear(&strbuf); + ffStrbufAppendDouble(&strbuf, -120.999999, 2); + VERIFY(ffStrbufEqualS(&strbuf, "-121.00")); + ffStrbufClear(&strbuf); ffStrbufAppendDouble(&strbuf, 1.2345e50, 1); VERIFY(ffStrbufEqualS(&strbuf, "1.2345e50")); @@ -832,12 +848,12 @@ int main(void) VERIFY(ffStrbufEqualS(&strbuf, "-123450000000000000000.0")); ffStrbufClear(&strbuf); - ffStrbufAppendDouble(&strbuf, 0, 0); + ffStrbufAppendDouble(&strbuf, +0.0, 0); VERIFY(ffStrbufEqualS(&strbuf, "0")); ffStrbufClear(&strbuf); - ffStrbufAppendDouble(&strbuf, -0, 0); - VERIFY(ffStrbufEqualS(&strbuf, "0")); + ffStrbufAppendDouble(&strbuf, -0.0, 0); + VERIFY(ffStrbufEqualS(&strbuf, "-0")); ffStrbufDestroy(&strbuf); }