Отображение десятичного числа

#c

Вопрос:

кто-нибудь знает, как представить цифры слева от десятичной точки? Я хочу отобразить число 5 цифр слева от точки и 4 цифры справа от нее/ для упражнения 12345/100 я хочу получить 00123.4500

Комментарии:

1. Используйте printf() со строкой формата, которая определяет ширину поля в 10 символов, начальные нули и 4 цифры после десятичной точки.

2. Имейте в виду, что десятичное число 123.45 точно не существует на двоичном компьютере. Если вы печатаете с помощью 0.4f , вы должны получить 00123.4500 , как было запрошено. Но если бы вы напечатали его так, как %.20f вы могли бы увидеть что-то вроде 123.4499969482421875 или 123.4500000000000028422 (в зависимости от того, был ли номер сохранен как a float или a double ).

3. @SteveSummit Все дело в том, как представлены числа. Это касается одного из преимуществ представления с фиксированной точкой, упомянутого в моем ответе ниже. В ОП не указано, что используется плавающая точка (хотя я признаю, что в данном случае это справедливое предположение).

Ответ №1:

 printf("0.4f", (double)12345/100);
 

man 3 printf говорит:

 The overall syntax of a conversion specification is:

%[$][flags][width][.precision][length modifier]conversion
 

.4 означает точность с плавающей запятой для печати 4 десятичных знаков.

0 это флаг, который означает заполнение с 0.

10 это ширина. Если справа от десятичного знака 4, а слева 5, общее число равно 10 (с точкой).

Комментарии:

1. Разве так не должно быть 0.4f ? Ширина поля-это целое число, а не только перед десятичной дробью.

Ответ №2:

Хотя ответ alinsoar является правильным и наиболее распространенным случаем, я хотел бы упомянуть еще одну возможность, которая иногда бывает полезной: представление с фиксированной точкой.

Целое uint32_t число содержит 9 десятичных цифр. Мы можем выбрать представление десятичной точки перед 4-й цифрой справа. Тогда пример будет выглядеть следующим образом:

 #include <stdint.h>
#include <stdio.h>
#include <inttypes.h>

int main(void)
{
    uint32_t a = 123450000;   // 12345.0000
    uint32_t b = a / 100;     //   123.4500
    uint32_t i = b / 10000;   // integer part
    uint32_t f = b % 10000;   // fractional part
    printf("" PRIu32 "." PRIu32, i, f);  // 5 integer digits, 4 fractional digits 
}
 

При использовании с фиксированной точкой необходимо уделять особое внимание диапазону значений, и, например, умножение требует специальной обработки, но есть случаи, когда оно предпочтительнее представления с плавающей запятой.