Строки в Java неизменяемы. Это означает, что всякий раз, когда вы пытаетесь изменить / изменить строку, вы получаете новый экземпляр. Вы не можете изменить исходную строку. Это сделано для того, чтобы эти экземпляры строк могли кэшироваться. Типичная программа содержит множество ссылок на строки и кеширование этих экземпляров, что может уменьшить объем памяти и увеличить производительность программы.
При использовании оператора == для сравнения строк вы не сравниваете содержимое строки , но фактически сравнивают адрес памяти. Если они равны, в противном случае они вернут true и false. Если значение равно в строке, сравнивает содержимое строки.
Итак, вопрос в том, что все строки кэшируются в системе, как получается ==
возвращает false, тогда как equals возвращает true? Ну, это возможно. Если вы создадите новую строку, например String str = new String("Testing")
, вы создадите новую строку в кеше, даже если в кеше уже содержится строка с тем же содержимым. Короче говоря, "MyString" == new String("MyString")
всегда будет возвращать false.
Java также говорит о функции intern (), которая может использоваться в строке, чтобы сделать ее частью кеша, поэтому "MyString" == new String("MyString").intern()
вернет true.
Примечание: == оператор намного быстрее, чем равен только потому, что вы сравниваете два адреса памяти, но вы должны быть уверены, что код не создает новые экземпляры String в коде. В противном случае вы столкнетесь с ошибками.
Я считаю, что самый простой подход заключается в использовании функции format()
.
Например:
a = 13.949999999999999
format(a, '.2f')
13.95
Это создает число с плавающей точкой в виде строки, округленной до двух десятичных знаков точек.
Никто здесь, похоже, не упомянул об этом, поэтому позвольте мне привести пример в формате f-string / template-string Python 3.6, который, я думаю, красиво опрятен:
>>> f'{a:.2f}'
It хорошо работает и с более длинными примерами, с операторами и не нуждающимися в парсе:
>>> print(f'Completed in {time.time() - start:.2f}s')
orig_float = 232569 / 16000.0
14.5355625
blockquote>short_float = float("{:.2f}".format(orig_float))
14.54
blockquote>
Чтобы округлить число до разрешения, наилучшим способом является следующий, который может работать с любым разрешением (0,01 для двух десятичных знаков или даже других шагов):
>>> import numpy as np
>>> value = 13.949999999999999
>>> resolution = 0.01
>>> newValue = int(np.round(value/resolution))*resolution
>>> print newValue
13.95
>>> resolution = 0.5
>>> newValue = int(np.round(value/resolution))*resolution
>>> print newValue
14.0
"%.2f" % round(a,2)
вы можете добавить не только в printf, но и в таких вещах, как str()
– andilabs
1 November 2013 в 03:15
numvar=12.456
, то "{:.2f}".format(numvar)
дает 12.46
, но "{:2i}".format(numvar)
дает ошибку, и я ожидаю 12
.
– skytux
12 December 2013 в 17:47
round
в первую очередь. С другой стороны, поскольку это решение все еще использует с плавающей точкой, исходная проблема OP остается, даже для «исправленной» версии этого «решения».
– John Y
17 June 2014 в 23:54
'{0:,.2f}'.format(1333.949999999)
, который печатает '1,333.95'
.
– Stephen Blum
20 June 2014 в 03:41
float()
; float("{0:.2f}".format(13.9499999))
– Jossef Harush
17 August 2014 в 14:22
round
(которая использовалась в вопросе).
– interjay
12 September 2014 в 23:55
round()
не работает как упомянутый OP.
– Pithikos
18 February 2015 в 14:28
numpy.round
. Поэтому требуется определить его как int перед умножением с разрешением. Я обновил код. Спасибо вам за это!
– iblasi
13 April 2016 в 16:28
float
(двойная точность) и нормальном round
, а не о numpy.double и его преобразовании в строку. Обычное округление Python действительно не может быть сделано лучше, чем в Python 2.7. Большинство ответов написано до 2.7, но они устарели, хотя изначально они были очень хорошими. Это и есть причина моего ответа.
– hynekcer
15 April 2016 в 11:02
numpy.float64
результат np.round в float
или просто использовать round(value, 2)
. Не существует действительного номера IEEE 754 между 13.949999999999999 (= 1395 / 100.) и 3.950000000000001 (= 1395 * .01). Почему вы думаете, что ваш метод лучше? Исходное значение 13.949999999999999289 (= value = round (value, 2)) еще точнее, чем ваш 13.95000000000000178 (напечатан np.float96). Более подробная информация о numpy теперь добавлена к моему ответу , который вы, вероятно, по ошибке проигнорировали. Первоначально это было не так.
– hynekcer
15 April 2016 в 13:04
int
вы также можете использовать float
для примера @szeitlin. Спасибо за ваш дополнительный комментарий. (Извините, но я не спустил вас вниз)
– iblasi
15 April 2016 в 20:49
float
) является всего лишь ближайшей доступной аппроксимацией десятичного числа (с которым вы знакомы как человек). Нет такого (конечно-представимого) двоичного значения, равного 0.245. Это просто не существует, и математически не может существовать . Бинарное значение, которое ближе всего к 0.245, немного меньше 0.245, поэтому, естественно, оно округляется вниз. Аналогично, в двоичном коде нет такой величины, как 0.225, но двоичное значение, которое ближе всего к 0.225, немного больше 0.225, поэтому, естественно, оно округляется.
– John Y
14 June 2016 в 19:06
Decimal
, и это было одним из решений, представленных в этом ответе. Другим было преобразование ваших величин в целое число и использование целочисленной арифметики. Оба эти подхода также появились в других ответах и комментариях.
– John Y
15 June 2016 в 19:45
1
, за исключением «постепенного переполнения».
– Rick James
17 May 2017 в 04:16
getcontext().prec = 6
работает только для сферы действия или всех мест?
– Julio Marins
4 October 2017 в 20:12
round(2.16, 1)
дают 2.2
, почему python просто предлагает функцию truncate
– jiamo
8 January 2018 в 04:31
output
имеет то же самое значение i> как a
, поэтому вы могли бы также записать print a
вместо print output
в последней строке.
– Mark Dickinson
26 May 2018 в 06:12
Метод, который я использую, - это метод нарезания строк. Это относительно быстро и просто.
Сначала преобразуем float в строку, выберите длину, в которой вы хотели бы быть.
float = str(float)[:5]
В одной строке выше мы 'преобразовал значение в строку, а затем сохранил строку только до ее первых четырех цифр или символов (включительно).
Надеюсь, что это поможет!
Как отметил @Matt, Python 3.6 предоставляет f-строки , и они также могут использовать вложенные параметры :
value = 2.34558
precision = 2
width = 4
print(f'result: {value:{width}.{precision}f}')
, которые будут дисплей result: 2.35
Большинство чисел не могут быть точно представлены в поплавках. Если вы хотите округлить число, потому что это то, что требуется вашей математической формуле или алгоритму, то вы хотите использовать раунд. Если вы просто хотите ограничить отображение определенной точностью, тогда даже не используйте раунд и просто не форматируйте его как эту строку. (Если вы хотите отобразить его с помощью некоторого альтернативного метода округления, и есть тонны, то вам нужно смешать два подхода.)
>>> "%.2f" % 3.14159
'3.14'
>>> "%.2f" % 13.9499999
'13.95'
И, наконец, хотя, возможно, самое главное, если вы хотите точная математика, тогда вы не хотите плавать вообще. Обычный пример - это деньги и хранить центы как целое.
float(format(a, '.2f'))
– T. Webster 22 July 2017 в 20:00