Як я можу видалити десяткову частину з номера JavaScript?


218

У мене є результати ділення, і я хочу відкинути десяткову частину отриманого числа.

Як я можу це зробити?

Відповіді:


384

Ви можете використовувати ...

  • Math.trunc() (усічена дробова частина, також див. нижче)
  • Math.floor() (округлюємо вниз)
  • Math.ceil() (округлити)
  • Math.round() (округніть до найближчого цілого числа)

... залежно від того, як ви хотіли видалити десятковий.

Math.trunc()Ще не підтримується на всіх платформах (а саме в IE), але ви можете тим часом легко використовувати поліфайл .

Інший метод обрізання дробової частини з відмінною підтримкою платформи - це використання побітового оператора (.eg |0). Побічним ефектом використання побітового оператора на число є те, що він буде трактувати його операнд як підписане 32-бітове ціле число, тому видаляючи дробову складову. Майте на увазі, що це також буде маніпулювати числами більше 32 біт.


Ви також можете говорити про неточність десяткового округлення з арифметикою з плаваючою комою.

Обов’язкове читання - що повинен знати кожен комп'ютерний арифметик з арифметикою з плаваючою комою .


29
Майте на увазі , що Math.floor()буде збільшувати числове значення , коли число негативне . Таким чином , в Math.floor(-1.2) -> -2той час Math.floor(1.2) -> 1. parseInt(-1.2) -> -1( як зазначає @FloydPink ) відкине десяткову частину, як очікувалося, і для позитивних, і для від’ємних чисел.
Пол Т. Раукін

1
@ PaulT.Rawkeen Ви також можете використовувати побітовий оператор, щоб скинути десяткову частину, але пам’ятайте, що вона також скорочується до 32 біт.
алекс

2
наступне свідчить, що ця відповідь нестабільна:> (2.305*100)|0 > 230 > (2.3*100)|0 > 229
Джейк

4
@Jake Результатом роботи 2.3*100в javascript є 229.99999999999997, тому, здається, побітний оператор правильно виконує свою роботу у вашому прикладі.
Чад фон Нау

Чи є подібне рішення для того, |0що використовує 64-бітні цілі числа?
Клінт

49

Ви також можете використовувати побітові оператори для відсікання десяткової.

напр

var x = 9 / 2;
console.log(x); // 4.5

x = ~~x;
console.log(x); // 4

x = -3.7
console.log(~~x) // -3
console.log(x | 0) // -3
console.log(x << 0) // -3

Бітові операції значно ефективніші, ніж функції Math. Оператор подвійного не побітного розряду також, здається, трохи перевищує операції x | 0та x << 0бітові операції на незначну кількість.

// 952 milliseconds
for (var i = 0; i < 1000000; i++) {
    (i * 0.5) | 0;
}

// 1150 milliseconds
for (var i = 0; i < 1000000; i++) {
    (i * 0.5) << 0;
}

// 1284 milliseconds
for (var i = 0; i < 1000000; i++) {
    Math.trunc(i * 0.5);
}

// 939 milliseconds
for (var i = 0; i < 1000000; i++) {
    ~~(i * 0.5);
}

Також варто відзначити, що бітовий оператор не має переваги над арифметичними операціями, тому, можливо, вам знадобиться оточити обчислення дужками, щоб мати бажаний результат:

x = -3.7

console.log(~~x * 2) // -6
console.log(x * 2 | 0) // -7
console.log(x * 2 << 0) // -7

console.log(~~(x * 2)) // -7
console.log(x * 2 | 0) // -7
console.log(x * 2 << 0) // -7

Більш детальну інформацію про оператора подвійного розрядного перегляду не можна знайти в Double bitwise NOT (~~)


2
Може бути незначно ефективним. Але я б запропонував функції "Математика" як її більш читабельну.
ashipj

Цілком імовірно, що це не працює, якщо ціле число не представлено як 32-бітні цілі числа ( stackoverflow.com/a/7488075/3655192 )
Хірокі

30

Ви також можете зробити

parseInt(a/b)

17
Зауважте, що parseIntдля великих чисел не буде надійно працювати, оскільки він працює, попередньо перетворивши свій аргумент у рядок, а для великих чисел в результаті буде використана експоненціальна позначення. Наприклад: var n = 22222222222222222222222; parseInt(n);повернеться 2, тому що n.toString()повертається 2.2222222222222223e+22.

2
Він також не використовує parseInt()для своєї мети, а це взяти число в рядку і повернути a Number.
alex

22

Ви також можете показати певну кількість цифр після десяткових знаків (тут 2 цифри), використовуючи наступний код:

var num = (15.46974).toFixed(2)
console.log(num) // 15.47
console.log(typeof num) // string


4
Майте на увазі, що toFixed () повертає рядок, а не число. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Jeanmichel Cote

1
Як це відповідь, як ОП із проханням вилучити десяткову частину
Ісаак

3
Хоча він повертає рядок, ви можете просто скористатися методом Number (), щоб виправити це .. Number ((15.46974) .toFixed (2))
iPzard

13

Використовуйте Math.round()функцію.

Math.round(65.98) // will return 66 
Math.round(65.28) // will return 65

17
Для повноти це звичайний JavaScript, а не запит.
Дейв Ньютон

1
$.round = Math.round;)
alex


6

З ES2015 доступний Math.trunc () .

Math.trunc(2.3)                       // 2
Math.trunc(-2.3)                      // -2
Math.trunc(22222222222222222222222.3) // 2.2222222222222223e+22
Math.trunc("2.3")                     // 2
Math.trunc("two")                     // NaN
Math.trunc(NaN)                       // NaN

Він не підтримується в IE11 або нижче, але працює в Edge та будь-якому іншому сучасному браузері.


2
Чи знаєте будь-які варіанти, які дозволяють скоротити до X десяткових знаків? Чи було б наївно думати, що Math.trunc(value * Math.pow(10,x)) / Math.pow(10,x)це спрацює?
jamiebarrow

2
Ей, Джеймі, схоже, що це спрацювало б у більшості випадків, але це сприйнятливо до плавання з плаваючою точкою. наприклад, value = 2.3і x = 2повернеться 2.29. Я не маю кращої пропозиції.
Чад фон Нау

Це для мене звучить як правильна відповідь. Без округлення верхнього або нижнього. Немає проблем із від’ємними числами. Просто відмовтеся від десяткової. Як і запитання.
Енріке Морено намет

2

Якщо ви не переймаєтесь роудінгом, просто перетворіть номер у рядок, а потім видаліть усе після періоду, включаючи період. Це працює, є десятка чи ні.

const sEpoch = ((+new Date()) / 1000).toString();
const formattedEpoch = sEpoch.split('.')[0];

1

toFixed буде вести себе як кругле.

Для такої підлоги, як поведінка, використовуйте%:

var num = 3.834234;
var floored_num = num - (num % 1); // floored_num will be 3

2
Чому ви вважаєте, що це краще, ніж використовувати Math.floor? Ваше рішення здається зайвим складним та повільним. Я не знаю, як працює Math.floor, але сподіваюся, що він буде набагато оптимізованішим. Також мені цікаво, чи може ваше рішення постраждати від помилок округлення з плаваючою комою.
Ганс Рердінкхолдер

1

Ось стислий в детальному поясненні за допомогою вищезазначених постів:

1. Math.trunc (): використовується для видалення цифр, за якими слідує крапка. Це перетворюється неявно. Але, не підтримується в IE.

Приклад:

Math.trunc (10.5) // 10

Math.trunc (-10,5) // -10

Інший альтернативний спосіб: Використання побітових операторів:

Приклад:

х = 5,5

~~ x // 5

2. Math.floor (): використовується для надання мінімального цілого значення, яке можливо. Він підтримується у всіх браузерах.

Приклад:

Математичний поверх (10.5) // 10

Math.floor (-10,5) // -11

3. Math.ceil (): використовується для отримання максимально можливого цілого значення. Він підтримується у всіх браузерах.

Приклад:

Math.ceil (10,5) // 11

Math.ceil (-10,5) // -10

4. Math.round (): округлюється до найближчого цілого числа. Він підтримується у всіх браузерах.

Приклад:

Math.round (10.5) // 11

Math.round (-10,5) // -10

Math.round (10.49) // 10

Math.round (-10,51) // -11


1

Наприклад:

var x = 9.656;
x.toFixed(0);           // returns 10
x.toFixed(2);           // returns 9.66
x.toFixed(4);           // returns 9.6560
x.toFixed(6);           // returns 9.656000 

або

parseInt("10");         // returns 10
parseInt("10.33");      // returns 10
parseInt("10 20 30");   // returns 10
parseInt("10 years");   // returns 10
parseInt("years 10");   // returns NaN  

Я не бачу, чому ця відповідь не має ніяких кудо, вона працює для мене і вона інтегрована в стандарти реагування / JavaScript
cwiggo

0

Для реалізації ES6 використовуйте щось на зразок наступного:

const millisToMinutesAndSeconds = (millis) => {
  const minutes = Math.floor(millis / 60000);
  const seconds = ((millis % 60000) / 1000).toFixed(0);
  return `${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;
}

0

Це для тих, хто хоче перешкодити користувачам вводити десяткові числа

<input id="myInput" onkeyup="doSomething()" type="number" />

<script>
    function doSomething() {

        var intNum = $('#myInput').val();

        if (!Number.isInteger(intNum)) {
            intNum = Math.round(intNum);
        }

        console.log(intNum);
    }
</script>

0

Ви можете використовувати .toFixed (0), щоб видалити повну десяткову частину або вказати число в аргументах, до яких ви хочете відрізати десятковий.

Примітка: toFixed перетворить число в рядок.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.