Два пути я знаю, ни очень умна, к сожалению, но это скорее ограничение окружающей среды, а не меня :-)
Первый находится в sprintf
номер в большой буфер с помощью строки формата "%.50f"
, отделяйте конечные нули, затем подсчитывайте символы после десятичной точки. Это будет ограничено самим семейством printf
. Или вы можете использовать строку в качестве входных данных пользователя (а не sprintf
с плавающей точкой), чтобы избежать проблем с плавающей запятой в целом.
Второй заключается в том, чтобы вычесть целочисленную часть, затем итеративно умножить на 10 и снова вычесть целочисленную часть, пока не получите нуль. Это ограничивается пределами компьютерного представления чисел с плавающей запятой - на каждом этапе вы можете получить проблему числа, которое невозможно представить точно (так .2155 может быть фактически .215499999998). Что-то вроде следующего (непроверенные, за исключением того, в моей голове, что примерно на одном уровне с COMX-35):
count = 0
num = abs(num)
num = num - int(num)
while num != 0:
num = num * 10
count = count + 1
num = num - int(num)
Если вы знаете, то цифры, которые вы будете получать (например, все они будут От 0 до 4 цифр после десятичной точки), вы можете использовать стандартные «трюки» с плавающей запятой, чтобы сделать это правильно. Например, вместо:
while num != 0:
использования
while abs(num) >= 0.0000001:
Можете ли вы пояснить, «сколько десятичных чисел у числа»? Вы имеете в виду, сколько десятичных цифр находится в дробной части числа? – Doug
Да, ваше предположение верно. – Milan