Ограничение числа с плавающей запятой до двух десятичных знаков

function chunk(er){
return er.match(/.{1,75}/g).join('\n');
}

Выше функция - это то, что я использую для Chunking Base64. Он создаст разрыв строки, когда будет 75 символов.

1421
задан ShadowRanger 29 September 2017 в 04:42
поделиться

5 ответов

Вы сталкиваетесь старая проблема с числами с плавающей точкой, что не все числа могут быть представлены точно. Командная строка просто показывает Вам полную форму с плавающей точкой из памяти.

С представлением с плавающей точкой, Ваша округленная версия является тем же числом. Так как компьютеры являются двоичными, они хранят числа с плавающей точкой как целое число и затем делят его на питание два, таким образом, 13.95 будет представлен подобным способом 125650429603636838 / (2 ** 53).

Числа двойной точности имеют 53 бита (16 цифр) точности, и регулярные плавания имеют 24 бита (8 цифр) точности. тип с плавающей точкой в Python использует двойную точность для хранения значений.

, Например,

  >>> 125650429603636838/(2**53)
  13.949999999999999

  >>> 234042163/(2**24)
  13.949999988079071

  >>> a=13.946
  >>> print(a)
  13.946
  >>> print("%.2f" % a)
  13.95
  >>> round(a,2)
  13.949999999999999
  >>> print("%.2f" % round(a,2))
  13.95
  >>> print("{0:.2f}".format(a))
  13.95
  >>> print("{0:.2f}".format(round(a,2)))
  13.95
  >>> print("{0:.15f}".format(round(a,2)))
  13.949999999999999

, Если Вы только после двух десятичных разрядов (для отображения значения валюты, например), тогда у Вас есть несколько лучших вариантов:

  1. целые числа Использования и значения хранилища в центах, не долларах и затем делятся на 100 для преобразования в доллары.
  2. Или использование число фиксированной точки как десятичное число .
1419
ответ дан Matthias Braun 29 September 2017 в 04:42
поделиться

Это делает точно, что Вы сказали ему делать и работаете правильно. Считайте больше [приблизительно 110] беспорядок с плавающей точкой и возможно попробуйте десятичное число объекты вместо этого.

12
ответ дан Peter Mortensen 29 September 2017 в 04:42
поделиться
  • 1
    Это работает вполне прилично, но для меня это начинает со всеми расширенными путями - какие потребности быть измененным так, чтобы это запустилось со всего свернутого к первому уровню? *Редактирование: Я стер свое сообщение для редактирования его - благодаря @joe_coolish для быстрого ответа. .each () - то, в чем я нуждался – ZeekLTK 11 November 2013 в 18:57

Учебное руководство Python имеет приложение, названное Арифметика С плавающей точкой: Проблемы и Ограничения . Считайте его. Это объясняет, что происходит и почему Python прилагает все усилия. Это имеет даже пример, который соответствует Вашему. Позвольте мне заключить немного в кавычки:

>>> 0.1
0.10000000000000001

можно испытать желание использовать эти round() функция для прерывания его назад к единственной цифре, которую Вы ожидаете. Но это не имеет никакого значения:

>>> round(0.1, 1)
0.10000000000000001

проблема состоит в том, что двоичное значение с плавающей точкой, сохраненное для “0.1” уже, было самым лучшим двоичным приближением к 1/10, таким образом пробуя к раунду, это снова can’t делает его лучше: это было уже столь хорошо, как это добирается.

Другое последствие - то, что с тех пор 0.1 не точно 1/10, суммирование десяти значений 0.1 не может уступить точно 1.0, также:

>>> sum = 0.0
>>> for i in range(10):
...     sum += 0.1
...
>>> sum
0.99999999999999989

Одна альтернатива и решение Ваших проблем использовали бы decimal модуль.

21
ответ дан Peter Mortensen 29 September 2017 в 04:42
поделиться
  • 1
    @user986697 - I' m не уверенный, что Вы имеете в виду? Вы говорите о CSS? – joe_coolish 14 April 2014 в 01:28

Можно изменить выходной формат:

>>> a = 13.95
>>> a
13.949999999999999
>>> print "%.2f" % a
13.95
46
ответ дан Peter Mortensen 29 September 2017 в 04:42
поделиться

Большинство чисел не может быть точно представлено в плаваниях. Если Вы хотите к раунду число, потому что это - то, чего требуют Ваша математическая формула или алгоритм, то Вы хотите использовать вокруг. Если Вы просто хотите ограничить дисплей определенной точностью, то даже не используйте вокруг и просто форматируйте его как ту строку. (Если Вы хотите отобразить его с некоторым альтернативным методом округления, и существуют тонны, тогда необходимо смешать два подхода.)

>>> "%.2f" % 3.14159
'3.14'
>>> "%.2f" % 13.9499999
'13.95'

И наконец, хотя, возможно, самое главное, если Вы хотите точный математика тогда, Вы не хотите плавания вообще. Обычный пример имеет дело с деньгами и сохранить 'центы' как целое число.

89
ответ дан 29 September 2017 в 04:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: