Fix gcvt to always show 'ndigits' of precision

Leading zeros after the decimal point should not count
towards the 'ndigits' limit.

This makes gcvt match glibc and the posix gcvt man page.

Signed-off-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
Keith Packard 2019-12-18 08:49:06 -08:00 committed by Corinna Vinschen
parent abcc586ffe
commit 11f99384d2
1 changed files with 7 additions and 11 deletions

View File

@ -349,15 +349,10 @@ _gcvt (struct _reent *ptr,
char *end;
char *p;
if (invalue < 1.0)
{
/* what we want is ndigits after the point */
p = _dtoa_r (ptr, invalue, 3, ndigit, &decpt, &sign, &end);
}
else
{
p = _dtoa_r (ptr, invalue, 2, ndigit, &decpt, &sign, &end);
}
/* We always want ndigits of precision, even if that means printing
* a bunch of leading zeros for numbers < 1.0
*/
p = _dtoa_r (ptr, invalue, 2, ndigit, &decpt, &sign, &end);
if (decpt == 9999)
{
@ -383,11 +378,12 @@ _gcvt (struct _reent *ptr,
if (buf == save)
*buf++ = '0';
*buf++ = '.';
while (decpt < 0 && ndigit > 0)
/* Leading zeros don't count towards 'ndigit' */
while (decpt < 0)
{
*buf++ = '0';
decpt++;
ndigit--;
}
/* Print rest of stuff */