Я хотел бы преобразовать число с плавающей точкой в JavaScript. На самом деле, я хотел бы знать, как сделать ОБА из стандартных преобразований: путем усечения и округления. И эффективно, а не путем преобразования в строку и анализа.
javascript
syntax
mcherm
источник
источник
Ответы:
Ссылка на объект Math
Примеры
положительный отрицательный Положительный - Большие числа Отрицательный - Большие числаисточник
var intValue = ~~floatValue;
. Если запись слишком затемнять для ваших вкусов, просто скрыть его в функции:function toInt(value) { return ~~value; }
. (Это также преобразует строки в целые числа, если вы хотите это сделать.)Math.trunc(val);
Комментируйте, потому что это принятый ответ2.3 - 2.3 % 1
Побитовый оператор ИЛИ
Побитовый или оператор можно использовать для усечения чисел с плавающей запятой, и он работает как для положительных, так и для отрицательных значений:
Результаты
Сравнение производительности?
Я создал тест JSPerf, который сравнивает производительность между:
Math.floor(val)
val | 0
побитовое ИЛИ~~val
поразрядно НЕparseInt(val)
это работает только с положительными числами. В этом случае вы можете безопасно использовать побитовые операции как
Math.floor
функции.Но если вам нужен код для работы как с положительными, так и с отрицательными значениями , побитовая операция является самой быстрой (ИЛИ предпочтительной). Этот другой тест JSPerf сравнивает то же самое, где совершенно очевидно, что из-за дополнительной проверки знака Math теперь самый медленный из четырех.
Запись
Как указано в комментариях, операторы BITWISE работают с 32-разрядными целыми числами со знаком, поэтому большие числа будут преобразованы, например:
источник
Math.floor()
это быстрее (по крайней мере, в соответствии с моим выполнением вашего первого теста JSPerf в Google Chrome, версия 30.0.1599.101), более надежным (потому что это не зависит от того, как числа представлены в битах, что может изменить и, возможно, нарушить это побитовое решение), а главное, более явным.~~
лучше, потому что это унарный оператор.4.2|0+4
равно,4
но~~4.2+4
равно8
Примечание: вы не можете использовать
Math.floor()
в качестве замены для усечения, потому чтоMath.floor(-3.1) = -4
и не-3
!!Правильная замена для усечения будет:
источник
Math.trunc(value)
был добавлен в ECMAScript 6floor
округляет до бесконечности,truncate
округляет до нуля. (ceil
округляется до + бесконечности).Двойной побитовый оператор not можно использовать для усечения чисел с плавающей запятой. Другие операции , упомянутые вами доступны через
Math.floor
,Math.ceil
иMath.round
.Больше деталей любезно предоставлено Джеймсом Падолси.
источник
<canvas>
движка рендеринга шрифтов в JS . Спасибо!Для усечения:
Для тура:
источник
Вы можете использовать метод parseInt без округления. Будьте осторожны с пользовательским вводом из-за вариантов префикса 0x (шестнадцатеричный) и 0 (восьмеричный).
источник
parseInt(1000000000000000000000, 10);
результат 1, а не 1 000 000 000 000 000 000 000. Во всяком случае, вопрос явно не хотел " преобразования в строку и синтаксический анализ ", хотя это относительно незначительно ...;)parseInt()
ожидает строку, а не число в качестве первого параметра. Когда вы передаете это целое число, оно преобразуется в1e21
и затемparseInt
анализирует строку1e21
, что приводит к1
.Сдвиг битов на 0, что эквивалентно делению на 1
источник
>> 0
кажется, работает только для целых чисел < 2 ^ 31-1 , и>>> 0
для целых чисел < 2 ^ 32-1 . Это возвращает 0 для больших значенийВ вашем случае, когда вам нужна строка в конце (для вставки запятых), вы также можете просто использовать
Number.toFixed()
функцию, однако она выполнит округление.источник
Здесь много предложений. Побитовое ИЛИ кажется самым простым на сегодняшний день. Вот еще одно короткое решение, которое работает и с отрицательными числами, используя оператор по модулю. Это, вероятно, легче понять, чем побитовое ИЛИ:
Этот метод также работает с большими значениями, где ни «| 0», ни «~~», ни «>> 0» не работают правильно:
источник
Чтобы усечь :
Для округления :
источник
Еще один возможный способ - использовать операцию XOR:
Приоритет побитовых операций меньше, чем приоритет математических операций, это полезно. Попробуйте на https://jsfiddle.net/au51uj3r/
источник
Если вы посмотрите на нативный
Math
объект в JavaScript, вы получите целый набор функций для работы с числами и значениями и т. Д.В основном то, что вы хотите сделать, довольно просто и встроено в JavaScript ...
Представьте, что у вас есть номер ниже:
и теперь, если вы хотите округлить его до ближайшего числа, просто сделайте:
и вы получите:
Если вы хотите округлить его до ближайшего числа, просто выполните:
и вы получите:
Кроме
Math.round
того, округление до большего или меньшего числа зависит от того, какой из них ближе к числу смещения.Также вы можете использовать число
~~
с плавающей точкой, которое преобразует число с плавающей точкой в целое число.Вы можете использовать его как
~~myValue
...источник
~~
что если число больше предела int 32, оно изменит значение на предельное значение int 32.источник
Я просто хочу указать, что в денежном выражении вы хотите округлить, а не усечь. Снижение на пенни гораздо менее вероятно, так как округленное 4.999452 * 100 даст вам 5, более представительный ответ.
И, кроме того, не забывайте о банковском округлении , которое является способом противостоять слегка положительному смещению, которое дает прямое округление - вашему финансовому заявлению это может потребоваться.
Гауссово / банковское округление в JavaScript
источник
Если вы используете angularjs, тогда простое решение:
{{val | number:0}}
преобразует val в целое число
перейдите по этой ссылке docs.angularjs.org/api/ng/filter/number
источник