Какой смысл ширины меньше точности в printf ()? - PullRequest
7 голосов
/ 08 июля 2011

Я наткнулся на некоторый код со строкой, похожей на:

fprintf(fd, "%4.8f", ptr->myFlt);

В наши дни я мало работаю с C ++, я прочитал документацию по printf и тому подобному и узнал, что в этом случае 4 - это «ширина», а 8 - «точность». Ширина была определена как минимальное количество пробелов, занимаемых выводом, с заполнением начальными пробелами, если необходимо.

В таком случае, я не могу понять, какой будет точка шаблона типа "% 4.8f", поскольку 8 (заполняемые нулями, если необходимо) десятичные дроби после точки уже гарантируют, что ширина 4 будет достигнута и превышена. Итак, я написал небольшую программу для Visual C ++:

// Formatting width test

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
    printf("Need width when decimals are smaller: >%4.1f<\n", 3.4567);
    printf("Seems unnecessary when decimals are greater: >%4.8f<\n", 3.4567);
    printf("Doesn't matter if argument has no decimal places: >%4.8f<\n", (float)3);

    return 0;
}

, который дает следующий вывод:

Need width when decimals are smaller: > 3.5<
Seems unnecessary when decimals are greater: >3.45670000<
Doesn't matter if argument has no decimal places: >3.00000000<

В первом случае точность меньше указанной ширины, и фактически добавляется начальный пробел. Однако, когда точность больше, ширина кажется избыточной.

Есть ли причина для такого формата?

Ответы [ 3 ]

4 голосов
/ 08 июля 2011

Спецификатор формата ширины влияет только на вывод, если общая ширина напечатанного числа меньше указанной ширины. Очевидно, что этого никогда не произойдет, если точность установлена ​​больше или равна ширине. Таким образом, спецификация ширины в этом случае бесполезна.

Вот статья из MSDN; последнее предложение объясняет это.

Несуществующая или небольшая ширина поля не приводит к усечению поля; если результат преобразования шире, чем ширина поля, поле расширяется и содержит результат преобразования.

2 голосов
/ 08 июля 2011

Возможно, ошибка программиста? Возможно, они поменялись местами %8.4f или на самом деле намеревались %12.8f или даже %012.8f

См. Пример кодовой панели :

#include <stdio.h>

int main()
{
    printf("Seems unnecessary when decimals are greater: >%4.8f<\n", 3.4567);
    printf("Seems unnecessary when decimals are greater: >%8.4f<\n", 3.4567);
    printf("Seems unnecessary when decimals are greater: >%12.4f<\n", 3.4567);
    printf("Seems unnecessary when decimals are greater: >%012.4f<\n", 3.4567);

    return 0;
}

выход

Seems unnecessary when decimals are greater: >3.45670000<
Seems unnecessary when decimals are greater: >  3.4567<
Seems unnecessary when decimals are greater: >      3.4567<
Seems unnecessary when decimals are greater: >0000003.4567<
0 голосов
/ 08 июля 2011

Вероятно, только предположение, но: Точность дает десятичным числам одну длину, которая не будет превышена, если вы получили больше десятичных знаков. Аналогичным образом ширина предотвращает использование вашего номера меньшим пространством, чем должно. Если вы думаете о какой-то таблице с числами, вы можете получить одинаковые столбцы, только если каждый столбец в каждой строке имеет одинаковую ширину независимо от числа, которое он содержит.

Так что точность потребуется в таком ценовом формате, как 10,00 €, где вы всегда хотите 2 десятичных знака.

Для вашей конкретной строки: я чувствую, что вы по поводу избыточности спецификатора ширины в этом особом случае.

...