Я хочу напечатать двойное значение в Java без показательной формы.
double dexp = 12345678;
System.out.println("dexp: "+dexp);
Это показывает , что это E обозначения: 1.2345678E7
.
Я хочу напечатать это так: 12345678
Каков наилучший способ предотвратить это?
dexp: 12345681.000000
что это неправильное значение. И на самом деле после этого я хочу отобразить его на своей веб-странице, где он отображается так.1.2345678E7
Есть ли в любом случае, через который я могу сохранить его в любом двойном, как12345678
и любым другим способом?%.0f
.%.0f
округляет число. Есть ли способ просто отбросить конечные нули?Java предотвращает E запись в двойном:
Пять различных способов конвертировать двойное в нормальное число:
Эта программа печатает:
Которые все имеют одинаковую ценность.
Подсказка: если вы не уверены, почему эти случайные цифры появляются за определенным пороговым значением в двойном значении, это видео объясняет: computerphile, почему
0.1
+0.2
равно0.30000000000001
?http://youtube.com/watch?v=PZRI1IfStY0
источник
Коротко:
Если вы хотите избавиться от конечных нулей и проблем локали, то вам следует использовать:
Объяснение:
Почему другие ответы меня не устраивают:
Double.toString()
илиSystem.out.println
илиFloatingDecimal.toJavaFormatString
использует научные записи, если double меньше 10 ^ -3 или больше или равно 10 ^ 7Используя
%f
, десятичная точность по умолчанию равна 6, в противном случае вы можете жестко закодировать ее, но это приведет к добавлению дополнительных нулей, если у вас меньше десятичных знаков. Пример:Используя
setMaximumFractionDigits(0);
или%.0f
вы удаляете любую десятичную точность, которая подходит для целых / длинных, но не для двойной:Используя DecimalFormat, вы локально зависимы. Во французском языке десятичный разделитель - это запятая, а не точка:
Использование английского языка гарантирует, что вы получите точку для десятичного разделителя, где бы ни работала ваша программа.
Зачем использовать 340 тогда для
setMaximumFractionDigits
?Две причины:
setMaximumFractionDigits
принимает целое число, но его реализация имеет максимально допустимые цифры,DecimalFormat.DOUBLE_FRACTION_DIGITS
равные 340Double.MIN_VALUE = 4.9E-324
таким образом, с 340 цифрами вы точно не округлите свой двойной и не потеряете точность.источник
new BigDecimal(myvalue).toPlainString()
Из описания на docs.oracle.com/javase/7/docs/api/java/math/… ) не сразу очевидно, как оно ведет себя при использовании различных типов чисел, но оно устраняет научную нотацию ,new BigDecimal(0.00000021d).toPlainString()
вывод,0.0000002100000000000000010850153241148685623329583904705941677093505859375
который не то, что вы ожидаете ...BigDecimal.valueOf(0.00000021d).toPlainString()
работает также (он использует String конструктор BigDecimal, поэтому)Вы можете попробовать это с
DecimalFormat
. С этим классом вы очень легко разбираете свои числа.Вы можете точно установить шаблон, который вы хотите использовать.
В вашем случае, например:
источник
У меня есть другое решение, включающее в себя BigDecimal toPlainString (), но на этот раз с использованием String-конструктор, который рекомендуется в javadoc:
В кратчайшем виде это выглядит так:
До Java 8 это приводит к значению «0.0» для любых двойных чисел с нулевым значением, поэтому вам необходимо добавить:
NaN и бесконечные значения должны быть проверены дополнительно.
Окончательный результат всех этих соображений:
Это также может быть скопировано / вставлено, чтобы хорошо работать с Float.
источник
d.doubleValue() == 0
вместоd == 0
?Это будет работать до тех пор, пока ваш номер является целым числом:
Если переменная типа double имеет точность после десятичной точки, она ее усекает.
источник
Мне нужно было конвертировать некоторые двойные значения в валюты и я обнаружил, что большинство решений были в порядке, но не для меня.
В
DecimalFormat
конечном итоге это был путь для меня, поэтому вот что я сделал:Как видите, если число натуральное, я получаю, скажем, 20000000 вместо 2E7 (и т. Д.) - без десятичной точки.
И если это десятичное число, я получаю только две десятичные цифры.
источник
Компилятор Java / Kotlin преобразует любое значение больше 9999999 (больше или равно 10 миллионам) в научную нотацию, т.е. Epsilion запись .
Например: 12345678 преобразуется в 1,2345678E7
Используйте этот код, чтобы избежать автоматического преобразования в научную нотацию:
источник
Следующий код определяет, представлен ли указанный номер в научной записи. Если это так, то он представлен в обычном формате с максимумом «25» цифр.
источник
Я думаю, что у всех была правильная идея, но все ответы были не простыми. Я вижу, что это очень полезный кусок кода. Вот фрагмент того, что будет работать:
Здесь
".8"
вы указываете количество десятичных разрядов, которые вы хотели бы показать.Я использую Eclipse, и это не сработало.
Надеюсь, это было полезно. Буду признателен за любые отзывы!
источник
У меня была такая же проблема в моем производственном коде, когда я использовал его в качестве строкового ввода в функцию math.Eval (), которая принимает строку типа «x + 20/50»
Я просмотрел сотни статей ... В конце концов я пошел с этим из-за скорости. И поскольку функция Eval собиралась в конечном итоге преобразовать ее обратно в свой собственный числовой формат, и math.Eval () не поддерживал завершающий E-07, который возвращали другие методы, и что-либо более 5 dp было слишком много деталей для моего приложения в любом случае ,
Это теперь используется в производственном коде для приложения, которое имеет более 1000 пользователей ...
источник
Это может быть касательная .... но если вам нужно поместить числовое значение в виде целого числа (которое слишком велико, чтобы быть целым числом) в сериализаторе (JSON и т. Д.), То вам, вероятно, нужен "BigInterger"
Пример: значение является строкой - 7515904334
Мы должны представить его как число в сообщении Json: {"contact_phone": "800220-3333", "servicer_id": 7515904334, "servicer_name": "SOME CORPORATION"}
Мы не можем его распечатать или получим: {"contact_phone": "800220-3333", "servicer_id": "7515904334", "servicer_name": "НЕКОТОРАЯ КОРПОРАЦИЯ"}
Добавление значения к узлу таким образом приводит к желаемому результату: BigInteger.valueOf (Long.parseLong (value, 10))
Я не уверен, что это действительно по теме, но, так как этот вопрос был моим главным хитом, когда я искал свое решение, я думал, что поделюсь здесь для пользы других, лгите мне, кто плохо ищет. : D
источник
Для целочисленных значений, представленных как
double
, вы можете использовать этот код, который намного быстрее, чем другие решения.источник
Мое решение: String str = String.format ("% .0f", yourDouble);
источник