Я хотів би перетворити float на ціле число в JavaScript. Насправді, я хотів би знати, як зробити БОТУ стандартних перетворень: обрізанням і округленням. І ефективно, не перетворюючи на рядок і розбираючи.
Я хотів би перетворити float на ціле число в JavaScript. Насправді, я хотів би знати, як зробити БОТУ стандартних перетворень: обрізанням і округленням. І ефективно, не перетворюючи на рядок і розбираючи.
Відповіді:
var intvalue = Math.floor( floatvalue );
var intvalue = Math.ceil( floatvalue );
var intvalue = Math.round( floatvalue );
// `Math.trunc` was added in ECMAScript 6
var intvalue = Math.trunc( floatvalue );
Посилання на математичний об'єкт
// value=x // x=5 5<x<5.5 5.5<=x<6
Math.floor(value) // 5 5 5
Math.ceil(value) // 5 6 6
Math.round(value) // 5 5 6
Math.trunc(value) // 5 5 5
parseInt(value) // 5 5 5
~~value // 5 5 5
value | 0 // 5 5 5
value >> 0 // 5 5 5
value >>> 0 // 5 5 5
value - value % 1 // 5 5 5
Негативний
// value=x // x=-5 -5>x>=-5.5 -5.5>x>-6
Math.floor(value) // -5 -6 -6
Math.ceil(value) // -5 -5 -5
Math.round(value) // -5 -5 -6
Math.trunc(value) // -5 -5 -5
parseInt(value) // -5 -5 -5
value | 0 // -5 -5 -5
~~value // -5 -5 -5
value >> 0 // -5 -5 -5
value >>> 0 // 4294967291 4294967291 4294967291
value - value % 1 // -5 -5 -5
Позитивний - Більша кількість
// x = Number.MAX_SAFE_INTEGER/10 // =900719925474099.1
// value=x x=900719925474099 x=900719925474099.4 x=900719925474099.5
Math.floor(value) // 900719925474099 900719925474099 900719925474099
Math.ceil(value) // 900719925474099 900719925474100 900719925474100
Math.round(value) // 900719925474099 900719925474099 900719925474100
Math.trunc(value) // 900719925474099 900719925474099 900719925474099
parseInt(value) // 900719925474099 900719925474099 900719925474099
value | 0 // 858993459 858993459 858993459
~~value // 858993459 858993459 858993459
value >> 0 // 858993459 858993459 858993459
value >>> 0 // 858993459 858993459 858993459
value - value % 1 // 900719925474099 900719925474099 900719925474099
Негативний - Більша кількість
// x = Number.MAX_SAFE_INTEGER/10 * -1 // -900719925474099.1
// value = x // x=-900719925474099 x=-900719925474099.5 x=-900719925474099.6
Math.floor(value) // -900719925474099 -900719925474100 -900719925474100
Math.ceil(value) // -900719925474099 -900719925474099 -900719925474099
Math.round(value) // -900719925474099 -900719925474099 -900719925474100
Math.trunc(value) // -900719925474099 -900719925474099 -900719925474099
parseInt(value) // -900719925474099 -900719925474099 -900719925474099
value | 0 // -858993459 -858993459 -858993459
~~value // -858993459 -858993459 -858993459
value >> 0 // -858993459 -858993459 -858993459
value >>> 0 // 3435973837 3435973837 3435973837
value - value % 1 // -900719925474099 -900719925474099 -900719925474099
var intValue = ~~floatValue;
. Якщо запис занадто затемнювати для ваших смаків, просто приховати його в функції: function toInt(value) { return ~~value; }
. (Це також перетворює рядки в цілі числа, якщо ви це робите.)
Math.trunc(val);
Прокоментуйте, оскільки це прийнята відповідь
2.3 - 2.3 % 1
Побіт або оператор можна використовувати для обрізання фігур з плаваючою точкою, і це працює як для позитивних, так і для негативних даних:
function float2int (value) {
return value | 0;
}
Результати
float2int(3.1) == 3
float2int(-3.1) == -3
float2int(3.9) == 3
float2int(-3.9) == -3
Я створив тест JSPerf, який порівнює продуктивність між:
Math.floor(val)
val | 0
побіжно АБО~~val
побіжно НЕparseInt(val)
що працює лише з додатними числами. У цьому випадку ви можете безпечно використовувати побітові операції та Math.floor
функції.
Але якщо вам потрібен ваш код для роботи як з позитивами, так і з негативами , то побізова операція є найшвидшою (АБО є кращою). Цей інший тест JSPerf порівнює те саме, де цілком очевидно, що через додаткову перевірку знаків Math зараз найповільніша з чотирьох.
Як зазначено в коментарях, оператори BITWISE працюють з підписаними 32-бітовими цілими числами, тому велика кількість буде перетворена, наприклад:
1234567890 | 0 => 1234567890
12345678901 | 0 => -539222987
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
!!
Правильною заміною для усікання буде:
function truncate(value)
{
if (value < 0) {
return Math.ceil(value);
}
return Math.floor(value);
}
Math.trunc(value)
додано в ECMAScript 6
floor
круги у бік нескінченності, truncate
круги до нуля. ( ceil
кругляє до + нескінченності).
Оператор з подвійним розрядом не може використовуватися для обрізання плавців. Інші операції , згадані вами доступні через Math.floor
, Math.ceil
і Math.round
.
> ~~2.5
2
> ~~(-1.4)
-1
<canvas>
двигуна візуалізації шрифту в JS . Дякую!
Для усічення:
var intvalue = Math.floor(value);
Для раунду:
var intvalue = Math.round(value);
Ви можете використовувати метод parseInt без округлення. Будьте уважні до введення користувачем через опції префікса 0x (шестигранний) та 0 (восьмеричний).
var intValue = parseInt(floatValue, 10);
parseInt(1000000000000000000000, 10);
результатом є 1, а не 1 000 000 000 000 000 000 000. Так чи інакше, питання явно не хотів " перетворюватися на рядок і розбирати ", хоча це відносно незначно ...;)
parseInt()
очікує, що рядок не є першим параметром. Коли ви передаєте це ціле число, воно перетворюється на, 1e21
а потім parseInt
аналізує рядок 1e21
, в результаті чого 1
.
Зсув бітів на 0, що еквівалентно діленню на 1
// >> or >>>
2.0 >> 0; // 2
2.0 >>> 0; // 2
>> 0
начебто, працює лише для цілих чисел < 2 ^ 31-1 , а >>> 0
для цілих чисел < 2 ^ 32-1 . Це повертає 0 для більших значень
У вашому випадку, коли ви хочете, щоб рядок в кінці (для того, щоб вставити коми), ви також можете просто скористатися Number.toFixed()
функцією, проте це виконає округлення.
Тут є багато пропозицій. Побіт АБО здається найпростішим на сьогоднішній день. Ось ще одне коротке рішення, яке також працює з від’ємними числами, а також використовуючи оператор модуля. Це, мабуть, простіше зрозуміти, ніж побіт АБО:
intval = floatval - floatval%1;
Цей метод також працює з великими числами, коли ні '| 0', ні '~~', ні '>> 0' не працюють правильно:
> n=4294967295;
> n|0
-1
> ~~n
-1
> n>>0
-1
> n-n%1
4294967295
Щоб урізати :
// Math.trunc() is part of the ES6 spec
Math.trunc( 1.5 ); // returns 1
Math.trunc( -1.5 ); // returns -1
// Math.floor( -1.5 ) would return -2, which is probably not what you wanted
Для округлення :
Math.round( 1.5 ); // 2
Math.round( 1.49 ); // 1
Math.round( -1.6 ); // -2
Math.round( -1.3 ); // -1
Ще один можливий спосіб - використовувати операцію XOR:
console.log(12.3 ^ 0); // 12
console.log("12.3" ^ 0); // 12
console.log(1.2 + 1.3 ^ 0); // 2
console.log(1.2 + 1.3 * 2 ^ 0); // 3
console.log(-1.2 ^ 0); // -1
console.log(-1.2 + 1 ^ 0); // 0
console.log(-1.2 - 1.3 ^ 0); // -2
Пріоритет розрядних операцій менший, ніж пріоритет математичних операцій, це корисно. Спробуйте на https://jsfiddle.net/au51uj3r/
Якщо заглянути в рідний Math
об’єкт у JavaScript, ви отримаєте цілу купу функцій для роботи над числами та значеннями тощо ...
В основному те, що ви хочете зробити, є досить простим і рідним в JavaScript ...
Уявіть, що у вас є номер нижче:
const myValue = 56.4534931;
а тепер, якщо ви хочете округлити його до найближчого числа, просто виконайте:
const rounded = Math.floor(myValue);
і ви отримуєте:
56
Якщо ви хочете округлити його до найближчого числа, просто зробіть:
const roundedUp = Math.ceil(myValue);
і ви отримуєте:
57
Також Math.round
просто округлення його до більшого або нижчого числа залежить від того, який з них ближче до числа флота.
Також ви можете використовувати ~~
поза числом float, яке перетворить поплавок на ціле число.
Ви можете використовувати його як ~~myValue
...
~~
що якщо число більше межі int 32, воно змінить значення на граничне значення int 32.
//Convert a float to integer
Math.floor(5.95)
//5
Math.ceil(5.95)
//6
Math.round(5.4)
//5
Math.round(5.5)
//6
Math.trunc(5.5)
//5
//Quick Ways
console.log(5.95| 0)
console.log(~~5.95)
console.log(5.95 >> 0)
//5
Я просто хочу зазначити, що грошово ви хочете округлити, а не обрізати. Відмовитися від копійки набагато менш вірогідно, оскільки 4.999452 * 100 в округленні дасть вам 5, більш представницьку відповідь.
На додаток до цього не забувайте про округлення банкіра , який є способом протистояти злегка позитивним ухилам, які дає пряме округлення - ваша фінансова заявка може цього вимагати.
Якщо ви використовуєте angularjs, тоді просте рішення наведене нижче в прив'язці шаблонів HTML
{{val | number:0}}
це перетворить val у ціле число
перейдіть за цим посиланням docs.angularjs.org/api/ng/filter/number