В JavaScript при преобразовании из числа с плавающей точкой в строку, как я могу получить только 2 цифры после десятичной точки? Например, 0,34 вместо 0,3445434.
427
В JavaScript при преобразовании из числа с плавающей точкой в строку, как я могу получить только 2 цифры после десятичной точки? Например, 0,34 вместо 0,3445434.
Ответы:
Специфика , если код не требует пояснений.
редактировать: ... или просто использовать
toFixed
, как предложено Тимом Бюте . Забыл это, спасибо (и upvote) за напоминание :)источник
toFixed()
будет имитировать то, чтоprintf()
делает что-то подобное в C. Однако,toFixed()
иMath.round()
будет обрабатывать округление по-другому. В этом случаеtoFixed()
эффектMath.floor()
будет аналогичным (если вы заранее умножаете оригинал на 10 ^ n и вызываетеtoFixed()
с n цифрами). «Правильность» ответа очень зависит от того, что ОП хочет здесь, и оба являются «правильными» по-своему.Есть функции для округления чисел. Например:
напечатает 5.04.
РЕДАКТИРОВАТЬ: скрипка
источник
var x = 5.036432346; var y = x.toFixed(2) + 100;
y
будет равен"5.03100"
(0.335).toFixed(2) == 0.34 == (0.345).toFixed(2)
…Будьте осторожны при использовании
toFixed()
:Во-первых, округление числа выполняется с использованием двоичного представления числа, что может привести к неожиданному поведению. Например
вместо
'0.6'
.Во-вторых, есть ошибка с IE
toFixed()
. В IE (по крайней мере, до версии 7, не проверял IE8), верно следующее:Это может быть хорошей идеей следовать предложению kkyy или использовать пользовательскую
toFixed()
функцию, напримеристочник
.toFixed()
метод в возвращаемое значение, что добавит требуемую точность, например:,return (Math.round(value * power) / power).toFixed(precision);
а также вернет значение в виде строки. В противном случае точность 20 игнорируется для меньших десятичных знаковtoFixed
: обратите внимание, что повышение точности может привести к неожиданным результатам:,(1.2).toFixed(16) === "1.2000000000000000"
while(1.2).toFixed(17) === "1.19999999999999996"
(в Firefox / Chrome; в IE8 последнее не выполняется из-за более низкой точности, которую IE8 может предложить внутри).(0.598).toFixed(2)
не производит0.6
. Это производит0.60
:)(0.335).toFixed(2) == 0.34 == (0.345).toFixed(2)
.Еще одна проблема, о которой следует знать, это то, что
toFixed()
в конце числа могут появляться ненужные нули. Например:Идея состоит в том, чтобы очистить вывод, используя
RegExp
:Соответствует
RegExp
конечным нулям (и, возможно, десятичной запятой), чтобы убедиться, что оно хорошо смотрится и для целых чисел.источник
источник
Существует проблема со всеми этими решениями, использующими множители. Решения kkyy и Кристофа, к сожалению, неверны.
Пожалуйста, проверьте свой код для номера 551.175 с двумя десятичными знаками - он округлится до 551,17, а должен быть 551,18 ! Но если вы проверите на экс. 451,175 все будет хорошо - 451,18. Так что трудно обнаружить эту ошибку на первый взгляд.
Проблема с умножением: попробуйте 551.175 * 100 = 55117.49999999999 (ups!)
Поэтому моя идея состоит в том, чтобы обработать его с помощью toFixed () перед использованием Math.round ();
источник
toFixed
это также влияет -(0.335).toFixed(2) == 0.34 == (0.345).toFixed(2)
… Какой бы метод ни использовался, лучше добавить эпсилон перед округлением.Ключ здесь, я думаю, состоит в том, чтобы сначала правильно округлить, затем вы можете преобразовать его в строку.
Теперь вы можете безопасно отформатировать это значение с помощью toFixed (p). Итак, с вашим конкретным случаем:
источник
Если вы хотите строку без округления, вы можете использовать этот RegEx (возможно, это не самый эффективный способ ... но это действительно легко)
источник
источник
return float_part ? int_part+'.'+float_part : int_part;
противном случае , если вы прошли Integer, он возвращается номер с точкой в конце (пример ввода:2100
, выход:2100.
)Может быть, вы также хотите десятичный разделитель? Вот функция, которую я только что сделал:
источник
Нельзя избежать противоречивого округления цен с фактическим значением x.xx5 с использованием умножения или деления. Если вам необходимо рассчитать правильные цены на стороне клиента, вы должны хранить все суммы в центах. Это связано с характером внутреннего представления числовых значений в JavaScript. Обратите внимание, что Excel страдает от тех же проблем, поэтому большинство людей не заметят мелких ошибок, вызванных этим явлением. Однако ошибки могут накапливаться всякий раз, когда вы складываете много вычисленных значений, существует целая теория, касающаяся порядка вычислений и других методов, чтобы минимизировать ошибку в конечном результате. Чтобы подчеркнуть проблемы с десятичными значениями, обратите внимание, что 0,1 + 0,2 не совсем равно 0,3 в JavaScript, а 1 + 2 равно 3.
источник
источник
Я использую этот код для форматирования поплавков. Он основан на,
toPrecision()
но он удаляет ненужные нули. Я бы приветствовал предложения о том, как упростить регулярное выражение.Пример использования:
источник