Добавить переменное количество завершающих нулей на основе входного целого числа

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

Чего я хочу достичь:
с положительным целым числом n я хочу иметь десятичную дробь 1/ n с n количеством цифр после запятой. Таким образом, первые 10 будут:

1/1 = 1        ->   1.0
1/2 = 0.5      ->   0.50
1/3 = 1.333... ->   1.333
1/4 = 0.25     ->   0.2500
1/5 = 0.2      ->   0.20000
1/6 = 0.666... ->   0.666666
1/7 = 0.142... ->   0.1428571
1/8 = 0.125    ->   0.12500000
1/9 = 0.111... ->   0.111111111
1/10 = 0.1     ->   0.1000000000

Предпочтительно, чтобы результат был в виде строки, и я использовал как можно более короткий код. Так что никаких циклов for или всех видов настроек Formatter. Желательно что-то вроде String.format(..., n); или какое-то другое короткое решение.

Я попробовал String.format("%f0", 1./n);, чтобы посмотреть, что он выведет, но в сумме получается только 7 цифр (не знаю, как это настроить и можно ли это настроить). Таким образом, для String.format("%f0", 1./8); на выходе 0.1250000 отсутствует 8-й ноль.


person Kevin Cruijssen    schedule 12.10.2016    source источник


Ответы (3)


Попробуйте следующее:

String.format("%." + n + "f", (1.0/n));
person Robert Kock    schedule 12.10.2016
comment
Хм... для n = 18 получается 0.0555555555555555500 вместо 0.055555555555555555 :S - person Kevin Cruijssen; 12.10.2016
comment
Это связано с тем, что у числа double всего 17 значащих цифр. - person Robert Kock; 12.10.2016
comment
Да, пришел к такому же выводу после комментария. Думаю, мне следует изучить BigDecimals и аналогичный формат на основе того, который вы предоставили. - person Kevin Cruijssen; 12.10.2016
comment
Хорошо, думаю, мне придется использовать вместо этого BigDecimal.ONE.divide(new BigDecimal(n), n, RoundingMode.CEILING).toString(). Тем не менее, я оставлю ваш ответ принятым, так как он работает как талисман до 17 лет и использует короткое String.format, как я предпочел для этого. Спасибо еще раз. - person Kevin Cruijssen; 12.10.2016

Если у вас не работает «одиночный» формат, есть простой обходной путь: создайте желаемый результат в два шага.

Пример для вашего случая 1/8:

  1. value = "0.125";
  2. вам нужна общая длина 10 ( 0 . и 8 цифр!), поэтому просто создайте другую строку padding = "00000";

И вернуть value + padding

Заполнение также можно легко выполнить с помощью String.format(); см. здесь различные примеры.

person GhostCat    schedule 12.10.2016