Спасибо за ссылки, которые дали некоторое руководство. Вот что я придумал: он позволяет вам указывать минимальную и максимальную точность, поэтому он ведет себя больше как функция C#, а также округляет последнее di git. Дайте мне знать, если нужно внести какие-то оптимизации или изменения.
void formatDouble(char* buf, double val, int precMin, int precMax) {
sprintf(buf, "%.*f", precMax, val);
int startpos = 0;
int length = strlen(buf);
bool found = false;
for (int z = 0; z < length; z++)
{
if (buf[z] == '.')
{
startpos = z;
found = true;
break;
}
}
if (!found)
return;
int endIndex = startpos + precMin;
found = false;
for (int z = precMax + startpos; z >= startpos + precMin; z--)
{
if (buf[z] >= '1' && buf[z] <= '9')
{
endIndex = z;
if (endIndex < startpos + precMax)
{
// Round Digit
if (buf[z + 1] >= '5')
buf[z]++;
}
found = true;
break;
}
}
for (int z = endIndex + 1; z <= length; z++)
{
if (z <= startpos + precMax)
buf[z] = 0;
}
}