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?
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:
Kullanabilirsin...
Math.trunc()
(kesirli kısmı kes, ayrıca aşağıya bakınız)Math.floor()
(aşağı yuvarlama)Math.ceil()
(hesabı yuvarlamak) Math.round()
(en yakın tam sayıya yuvarlanır)... 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 .
> (2.305*100)|0 > 230 > (2.3*100)|0 > 229
2.3*100
Javascript sonucu 229.99999999999997
, bu nedenle bitwise operatörünün örneğinizde işini doğru şekilde yaptığı anlaşılıyor.
|0
64bit tamsayılar kullananlara benzer bir çözüm var mı ?
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 | 0
ve x << 0
bitsel 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.
Ayrıca yapabilirsin
parseInt(a/b)
parseInt
Bü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
.
parseInt()
, bir dizede sayı almak ve a döndürmek amacıyla da kullanılmaz Number
.
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
Math.round()
Fonksiyonu kullanın .
Math.round(65.98) // will return 66
Math.round(65.28) // will return 65
$.round = Math.round
;)
Kullanın Math.round()
.
(Alex'in cevabı daha iyi; Bir varsayım yaptım :)
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.
Math.trunc(value * Math.pow(10,x)) / Math.pow(10,x)
işe yarayacağını düşünmek naif olur mu?
value = 2.3
ve x = 2
dönecektir 2.29
. Daha iyi bir öneri yok.
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
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
Ö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, 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>
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.
Math.floor()
olacak artırmak sayı olduğu zaman sayısal değeri negatif . DolayısıylaMath.floor(-1.2) -> -2
ikenMath.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.