Подсчет количества знаков после запятой в паскале

Я только начал изучать паскаль, и я должен делать паскаль в качестве домашней работы. Я сделал это, но я не знаю, как подсчитать количество десятичных разрядов в вещественном числе (количество цифр после ".").

Мне нужно просто отформатировать реальное число (например, write(real:0:dec) где dec это число десятичной цифры, я не знаю, как узнать). Я хотел бы сделать это, потому что я не хочу это в научной нотации или со многими ненужными нулями.

Например, если действительное число равно 1,51 (x), и я пишу writeln(x:0:4); или WriteLn(Format('%*.*f', [0, 4, x])); он покажет 1.5100, но я хочу, чтобы он был всего 1.51; и если число похоже на 1.513436, оно покажет только 1.5134 . Поэтому я бы сделал это как writeln(x:0:dec); с чем-то, что делает dec числом десятичных цифр x.

3 ответа

Решение

Format() функция обычно используется в подобных ситуациях.

WriteLn(Format('%*.*f', [0, dec, your_real_number]));

*.* интерпретируется как total_characters.decimal_digits, Пропуск нуля для первого означает, что ширина регулируется в зависимости от того, насколько велик ваш реальный. Число десятичных дробей может быть переменной (dec), которую вы можете настроить в соответствии со своей спецификацией.


Обновить:

Вы упоминаете, что хотите точное представление числа с плавающей запятой относительно количества десятичных знаков.

Как упоминалось в моем комментарии, большинство значений с плавающей запятой не имеет конечного числа десятичных знаков. И большинство десятичных дробей не могут быть представлены двоичным типом.

Есть несколько библиотек, которые могут обрабатывать значения с плавающей запятой произвольного размера. Увидеть TBigFloat например. Существует процедура форматирования, которая может удалять лишние нули из десятичного числа с плавающей запятой.


Тем не менее, есть возможность удалить конечные нули, используя общий спецификатор формата:

WriteLn(Format('%g',[your_real_number]));

Вы также можете указать ширину и количество значащих цифр.

Например, если у вас есть ввод x=1,51 в реальном типе переменной, то вы пишете только writeln(x), выход будет 1.5100000000. Если ты пишешь writeln(x:0:3), вывод будет 1,510 (3 цифры после ".") ...

var x: real;
Begin
x:=1.51;
writeln(x); //output 1.5100000000
writeln(x:0:4); //output 1.5100 (4 digits after ".")
writeln(x:0:2); //output 1.51 (2 digits after ".")
readln;
End.

Из вашего другого примера, если ваш ввод 1.512426, с writeln(x:0:5) он будет показывать только 5 цифр после "." и на выходе будет 1,51242

var x: real;
Begin
x:=1.512426;
writeln(x); //output 1.5124260000
writeln(x:0:4); //output 1.5124 (4 digits after ".")
writeln(x:0:2); //output 1.51 (2 digits after ".")
readln;
End. 

Итак, если вы напишите writeln(x:0:dec) вывод будет "dec" цифрами после "."

Надеюсь, это поможет, я просто пытаюсь ответить с другой точки зрения.

Если вы на самом деле делаете вывод writeln(), конечно, просто writeln(x);выполнил бы то, что вы после? Если вы действительно хотите посчитать количество десятичных знаков, вам, вероятно, придется преобразовать в строку, удалить все завершающие нули и посмотреть, где находится десятичная точка.

Другие вопросы по тегам