How to nicely format floating numbers to string without unnecessary decimal 0's
Как красиво отформатировать числа с плавающей запятой в строку без ненужных десятичных 0
64-битный double может точно представлять целое число + /- 253.
Учитывая этот факт, я выбираю использовать тип double в качестве единого типа для всех моих типов, поскольку мое наибольшее целое число - это 32-разрядное число без знака.
Но теперь я должен напечатать эти псевдо-целые числа, но проблема в том, что они также смешаны с фактическими двойными числами.
Итак, как мне красиво напечатать эти двойные значения в Java?
Я пробовал String.format("%f", value), что близко, за исключением того, что я получаю много завершающих нулей для небольших значений.
Конечно, я могу написать функцию для обрезки этих нулей, но это приводит к значительной потере производительности из-за манипулирования строками. Могу ли я добиться большего успеха с другим кодом формата?
Ответы Тома Э. и Джереми С. неприемлемы, поскольку оба они произвольно округляются до двух знаков после запятой. Пожалуйста, поймите проблему, прежде чем отвечать.
Пожалуйста, обратите внимание, что String.format(format, args...) это зависит от локали (см. Ответы ниже).
Переведено автоматически
Ответ 1
Если идея состоит в том, чтобы печатать целые числа, сохраненные в виде двойных чисел, как если бы они были целыми числами, и в противном случае печатать двойные числа с минимально необходимой точностью:
Double.toString() или System.out.println или FloatingDecimal.toJavaFormatString использует научные обозначения, если double меньше 10 ^ -3 или больше или равно 10 ^ 7
при использовании %f десятичная точность по умолчанию равна 6, в противном случае вы можете запрограммировать ее жестко, но это приведет к добавлению дополнительных нулей, если у вас меньше десятичных знаков. Пример:
Использование английской локали гарантирует, что вы получите точку для десятичного разделителя, где бы ни запускалась ваша программа.
Зачем тогда использовать 340 для setMaximumFractionDigits?
Две причины:
setMaximumFractionDigits принимает целое число, но его реализация имеет максимально допустимые цифры из DecimalFormat.DOUBLE_FRACTION_DIGITS, которые равны 340
Double.MIN_VALUE = 4.9E-324 таким образом, с 340 цифрами вы точно не будете округлять вдвое и терять точность