Предположим, у меня есть значение 15,7784514, я хочу отобразить его 15,77 без округления.
var num = parseFloat(15.7784514);
document.write(num.toFixed(1)+"<br />");
document.write(num.toFixed(2)+"<br />");
document.write(num.toFixed(3)+"<br />");
document.write(num.toFixed(10));
Результаты в -
15.8
15.78
15.778
15.7784514000
Как мне отобразить 15.77?
javascript
tempid
источник
источник
Ответы:
Преобразуйте число в строку, сопоставьте число с точностью до второго десятичного знака:
В
toFixed
отличие от этогоtoString
, метод в некоторых случаях дает сбой , поэтому будьте очень осторожны с ним.источник
toFixed
, хотя, так:(Math.floor(value * 100) / 100).toFixed(2)
. Как вы, вероятно, знаете, со значениями с плавающей запятой могут происходить странные прецизионные вещи (и на другой стороне спектра, если число оказывается15
, звучит так, как хочет ОП15.00
).Number((15.7784514000*100).toString().match(/^\d+/)/100);
Обновление 5 ноября 2016
Новый ответ, всегда точный
Поскольку математика с плавающей запятой в javascript всегда будет иметь крайние значения, предыдущее решение будет в большинстве случаев точным, что недостаточно. Есть некоторые решения этого , как
num.toPrecision
, BigDecimal.js и accounting.js . Тем не менее, я считаю, что простой анализ строки будет самым простым и всегда точным.Основываясь на обновленном хорошо написанном регулярном выражении из принятого ответа @Gumbo, эта новая функция toFixed всегда будет работать как положено.
Старый ответ, не всегда точный.
Сверните свою собственную функцию toFixed:
источник
toFixed(0.0000000052, 2)
дает «5,2». Это можно исправить, используяreturn num.toFixed(fixed+1).match(re)[0];
Уведомление о том, что я использую toFixed с одним десятичным знаком над целью, чтобы избежать округления, а затем запускаю ваше регулярное выражениеВместо этого я решил написать это, чтобы вручную удалить остаток со строками, чтобы мне не приходилось иметь дело с математическими проблемами, которые идут с числами:
Это даст вам «15,77» с числом = 15,7784514;
источник
Октябрь 2017
Общее решение - усечь (без округления) число до n-й десятичной цифры и преобразовать его в строку с ровно n десятичными цифрами для любого n≥0.
где x может быть числом (которое преобразуется в строку) или строкой.
Вот несколько тестов для n = 2 (включая тест, запрошенный OP):
* Как упомянуто в примечании, это связано с неявным преобразованием javascript в экспоненциальное для "1.99e-7" и для некоторых других значений n:
источник
toFixedTrunc(0.000000199, 2) // 1.99
parseInt быстрее, чем Math.floor
источник
Это вернется 19,66
источник
Просто сделай это
источник
Эти решения действительно работают, но мне кажутся излишне сложными. Мне лично нравится использовать оператор модуля для получения остатка от операции деления и удаления этого. Предполагая, что число = 15,7784514:
Это эквивалентно высказыванию num = num - (num% .01).
источник
Ответы здесь не помогли мне, они продолжали округляться или давать неправильный десятичный знак.
Мое решение преобразует ваш десятичный в строку, извлекает символы, а затем возвращает все это как число.
источник
Моя версия для положительных чисел:
Быстро, красиво, очевидно. (версия для положительных чисел)
источник
-0.7752
, Проверьте этоtoFixed_norounding(-0.7752,2)
возвращается-0.78
вместо-0.77
Следующий код работает очень хорошо для меня:
источник
-?
;)Я исправил, используя следующий простой способ:
Результаты будут 15.77
источник
-15.7784514
возвращается-15.78
Просто обрежьте цифры:
источник
Еще одно однострочное решение:
Я использовал 100, потому что вы хотите урезать до второй цифры, но более гибкое решение будет:
где цифры - это количество десятичных цифр для хранения.
Посмотрите спецификации Math.trunc для деталей и совместимости браузера.
источник
Вот, пожалуйста. Ответ, который показывает еще один способ решения проблемы:
Обратите внимание на использование + перед окончательным выражением. То есть, чтобы преобразовать нашу усеченную, отрезанную строку обратно в числовой тип.
Надеюсь, поможет!
источник
обрезать без нулей
или
тест:
усечь с нулями
тест:
источник
Это хорошо сработало для меня. Я надеюсь, что это исправит и ваши проблемы.
источник
Простой способ сделать это следующий, но необходимо убедиться, что значение параметра приведено в виде строки.
}
источник
источник
Я имел обыкновение
(num-0.05).toFixed(1)
получать второй десятичный этаж.источник
Мое решение в машинописи (может быть легко перенесено на JS):
Тестовые случаи:
Какие-нибудь улучшения?
источник
Прокрутите свою собственную
toFixed
функцию: для положительных значенийMath.floor
работает нормально.Для отрицательных значений
Math.floor
есть округление значений. Таким образом, вы можете использоватьMath.ceil
вместо этого.Пример,
источник
Второе решение Gumbo с регулярным выражением работает, но медленно из-за регулярного выражения. Первое решение Gumbo дает сбой в определенных ситуациях из-за неточности в числах с плавающей запятой. Посмотрите JSFiddle для демонстрации и эталона. Второе решение занимает около 1636 наносекунд на вызов в моей нынешней системе, процессор Intel Core i5-2500 с тактовой частотой 3,30 ГГц.
Решение, которое я написал, включает добавление небольшой компенсации, чтобы позаботиться о неточности с плавающей запятой. Это в основном мгновенно, то есть порядка наносекунд. Я набрал 2 наносекунды за звонок, но таймеры JavaScript не очень точны и не точны. Вот JS Fiddle и код.
источник
Опираясь на ответ Дэвида Д.
источник
Надежнее получить две плавающие точки без округления.
Ссылка Ответ
Спасибо !
источник
Уже есть подходящий ответ с регулярным выражением и арифметическим вычислением, вы также можете попробовать это
источник
Вот что сделал со строкой
источник
Все эти ответы кажутся немного сложными. Я бы просто вычел 0.5 из вашего числа и использовал бы toFixed ().
источник
Наиболее эффективное решение (для 2-х дробных цифр) состоит в том, чтобы вычесть 0,005 перед вызовом
toFixed()
Отрицательные числа тоже будут округлены (от нуля). ОП ничего не сказал об отрицательных числах.
источник
Я знаю, что уже есть несколько рабочих примеров, но я думаю, что стоит предложить мой эквивалент String.toFixed, некоторые могут найти его полезным.
Это моя альтернатива toFixed, которая не округляет числа, просто усекает их или добавляет нули в соответствии с заданной точностью. Для очень длинных чисел используется встроенное округление JS, когда точность слишком велика. Функция работает для всех проблемных чисел, которые я нашел в стеке.
Имейте в виду, что точность не может быть обработана должным образом для чисел длиной 18 и более, например, 64-битный Chrome будет округлять его или добавлять «e +» / «e-», чтобы длина номера оставалась равной 18.
Если вы хотите выполнять операции с действительными числами, то безопаснее
Math.sqrt(10, precision)
сначала умножить их на число , выполнить расчеты, а затем вычислить результат на величину множителя.Пример:
Вот почему так важно использовать такой множитель / делитель при работе с реальными числами в JavaScript, особенно когда вы рассчитываете деньги ...
источник