#c
Вопрос:
кто-нибудь знает, как представить цифры слева от десятичной точки? Я хочу отобразить число 5 цифр слева от точки и 4 цифры справа от нее/ для упражнения 12345/100 я хочу получить 00123.4500
Комментарии:
1. Используйте
printf()
со строкой формата, которая определяет ширину поля в 10 символов, начальные нули и 4 цифры после десятичной точки.2. Имейте в виду, что десятичное число 123.45 точно не существует на двоичном компьютере. Если вы печатаете с помощью
0.4f
, вы должны получить00123.4500
, как было запрошено. Но если бы вы напечатали его так, как%.20f
вы могли бы увидеть что-то вроде123.4499969482421875
или123.4500000000000028422
(в зависимости от того, был ли номер сохранен как afloat
или adouble
).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
}
При использовании с фиксированной точкой необходимо уделять особое внимание диапазону значений, и, например, умножение требует специальной обработки, но есть случаи, когда оно предпочтительнее представления с плавающей запятой.