Подсчет количества знаков после запятой в паскале
Я только начал изучать паскаль, и я должен делать паскаль в качестве домашней работы. Я сделал это, но я не знаю, как подсчитать количество десятичных разрядов в вещественном числе (количество цифр после ".").
Мне нужно просто отформатировать реальное число (например, 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);
выполнил бы то, что вы после? Если вы действительно хотите посчитать количество десятичных знаков, вам, вероятно, придется преобразовать в строку, удалить все завершающие нули и посмотреть, где находится десятичная точка.