Ondalık bölümü JavaScript numarasından nasıl kaldırabilirim?


218

Bir bölümün sonuçları var ve ortaya çıkan sayının ondalık kısmını atmak istiyorum.

Bunu nasıl yapabilirim?

Yanıtlar:


384

Kullanabilirsin...

... ondalık sayıyı nasıl kaldırmak istediğinize bağlı.

Math.trunc()henüz tüm platformlarda (IE) desteklenmemektedir, ancak bu arada bir çoklu dolguyu kolayca kullanabilirsiniz .

Kesirli kısmı mükemmel platform desteği ile kesmenin başka bir yöntemi, bitsel bir operatör (.eg |0) kullanmaktır. Bir sayı üzerinde bitsel bir işleç kullanmanın yan etkisi, işlenenini işaretli bir 32 bit tamsayı olarak ele alacağı ve dolayısıyla kesirli bileşeni kaldıracağıdır. Bunun 32 bit'ten büyük sayıları da değiştireceğini unutmayın.


Kayan nokta aritmetiği ile ondalık yuvarlamanın yanlışlığından da bahsediyor olabilirsiniz.

Zorunlu Okuma - Her Bilgisayar Bilimcisinin Kayan Noktalı Aritmetik Hakkında Bilmesi Gerekenler .


29
Unutmayın Math.floor()olacak artırmak sayı olduğu zaman sayısal değeri negatif . Dolayısıyla Math.floor(-1.2) -> -2iken Math.floor(1.2) -> 1. parseInt(-1.2) -> -1( @FloydPink tarafından belirtildiği gibi ) her ikisi için beklendiği gibi ondalık kısmı kaybolacak pozitif ve negatif sayılar.
Paul T. Rawkeen

1
@ PaulT.Rawkeen Ondalık kısmı düşürmek için bitsel bir operatör de kullanabilirsiniz, ancak bunun 32 bite düştüğünü de unutmayın.
alex

2
Aşağıdaki cevap bu kararsız olduğunu gösterir:> (2.305*100)|0 > 230 > (2.3*100)|0 > 229
Jake

4
@Jake 2.3*100Javascript sonucu 229.99999999999997, bu nedenle bitwise operatörünün örneğinizde işini doğru şekilde yaptığı anlaşılıyor.
Chad von Nau

|064bit tamsayılar kullananlara benzer bir çözüm var mı ?
Clint

49

Ondalık kesmeyi kesmek için bitsel işleçleri de kullanabilirsiniz.

Örneğin

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

Bitsel işlemler Math işlevlerinden çok daha verimlidir. Bitsel olmayan çift operatör ayrıca ihmal edilebilir bir miktarda x | 0ve x << 0bitsel işlemlerden biraz daha iyi performans gösterir .

// 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);
}

Ayrıca, bitsel olmayan operatörün aritmetik işlemlere göre önceliğe sahip olduğunu belirtmek gerekir, bu nedenle amaçlanan sonucu elde etmek için hesaplamaları parantez içine almanız gerekebilir:

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 operatörü hakkında daha fazla bilgi Double bitwise NOT (~~) adresinde bulunabilir.


2
Marjinal olarak verimli olabilir. Ancak, daha okunaklı olduğu için 'Matematik' fonksiyonlarını öneririm.
ashipj

Tamsayı 32 bit işaretli tamsayılar olarak temsil edilmezse bunun işe yaramadığı ihtimali vardır ( stackoverflow.com/a/7488075/3655192 )
Hiroki

30

Ayrıca yapabilirsin

parseInt(a/b)

17
parseIntBüyük sayılarda güvenilir bir şekilde çalışmayacağını unutmayın , çünkü öncelikle argümanını bir dizeye dönüştürerek çalışır ve büyük sayılar için sonuç üstel gösterimi kullanır. Örneğin: var n = 22222222222222222222222; parseInt(n);döner 2, çünkü n.toString()döner 2.2222222222222223e+22.

2
Ayrıca parseInt(), bir dizede sayı almak ve a döndürmek amacıyla da kullanılmaz Number.
alex

22

u ayrıca aşağıdaki kodu kullanarak ondalık noktadan sonra (burada 2 hane) belirli sayıda basamak gösterebilir:

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


4
ToFixed () öğesinin Number yerine bir String döndürdüğünü unutmayın. developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/…
Jeanmichel Cote

1
OP'nin ondalık kısmı kaldırmasını isteyen bir cevap nasıl
Isaac

3
Bir dize döndürür rağmen, sadece o düzeltmek için Number () yöntemini kullanabilirsiniz .. Numara ((15,46974) (2) .toFixed)
iPzard

13

Math.round()Fonksiyonu kullanın .

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

17
Tamlık için, bu sorgu değil, düz JavaScript'tir.
Dave Newton

1
$.round = Math.round;)
alex


6

ES2015 ile Math.trunc () kullanılabilir.

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 veya altında desteklenmez, ancak Edge'de ve diğer tüm modern tarayıcılarda çalışır.


2
X ondalık basamağına kısalmaya izin veren varyasyonları biliyor musunuz? Bunun Math.trunc(value * Math.pow(10,x)) / Math.pow(10,x)işe yarayacağını düşünmek naif olur mu?
jamiebarrow

2
Hey Jamie, bu çoğu durumda işe yarayacak gibi görünüyor, ama kayan nokta yakalarına karşı hassas. örneğin value = 2.3ve x = 2dönecektir 2.29. Daha iyi bir öneri yok.
Chad von Nau

Bu bana doğru cevap gibi geliyor. Üst veya alt yuvarlama yok. Negatif sayılarla ilgili sorun yok. Ondalık işareti atın. Sorunun istediği gibi.
Enrique Moreno Çadırı

2

Rouding ile ilgilenmiyorsanız, numarayı bir dizeye dönüştürün, sonra nokta da dahil olmak üzere her şeyi kaldırın. Bu ondalık olsun ya da olmasın çalışır.

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

1

toFixed yuvarlak gibi davranacaktır.

Zemine benzer davranışlar için% kullanın:

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

2
Neden Math.floor kullanmaktan daha iyi olduğunu düşünüyorsunuz? Çözümünüz gereksiz yere karmaşık ve yavaş görünüyor. Math.floor'un nasıl çalıştığını bilmiyorum, ama çok daha optimize olmasını bekliyorum. Ayrıca, çözümünüzün kayan nokta yuvarlama hatalarından muzdarip olup olmayacağını merak ediyorum.
Hans Roerdinkholder

1

Yukarıdaki mesajların yardımı ile ayrıntılı açıklamadaki sıkıştırma:

1. Math.trunc (): Nokta ile takip edilen rakamları silmek için kullanılır. Örtük olarak dönüşür. Ancak, IE'de desteklenmez.

Misal:

Math.trunc (10.5) // 10

Math.trunc (-10.5) // -10

Diğer Alternatif yolu: Bitsel olmayan operatör kullanımı:

Misal:

x = 5.5

~~ x // 5

2. Math.floor (): Mümkün olan en düşük tamsayı değerini vermek için kullanılır. Tüm tarayıcılarda desteklenir.

Misal:

Matematik zemin (10.5) // 10

Matematik zemin (-10.5) // -11

3. Math.ceil (): Mümkün olan en yüksek tamsayı değerini vermek için kullanılır. Tüm tarayıcılarda desteklenir.

Misal:

Math.ceil (10.5) // 11

Math.ceil (-10.5) // -10

4. Math.round (): En yakın tam sayıya yuvarlanır. Tüm tarayıcılarda desteklenir.

Misal:

Math.round (10.5) // 11

Math.round (-10.5) // -10

Math.round (10.49) // 10

Math.round (-10.51) // -11


1

Örneğin:

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 

veya

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  

Bu cevabın neden hiç
kudosu

0

ES6 uygulaması için aşağıdakine benzer bir şey kullanın:

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

0

Bu, kullanıcıların ondalık sayı girmesini önlemek isteyenler içindir

<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

Ondalık parçanın tamamını kaldırmak için .toFixed (0) kullanabilirsiniz ya da ondalık sayı kesilmesini istediğiniz bağımsız değişkenlerdeki sayıyı verebilirsiniz.

Not: toFixed, sayıyı dizeye dönüştürür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.