JavaScript'te bir şamandırayı tam sayıya dönüştürmek istiyorum. Aslında, standart dönüşümlerin her ikisini de nasıl yapacağımı bilmek istiyorum: keserek ve yuvarlayarak. Ve verimli bir şekilde, bir dizeye dönüştürme ve ayrıştırma yoluyla değil.
JavaScript'te bir şamandırayı tam sayıya dönüştürmek istiyorum. Aslında, standart dönüşümlerin her ikisini de nasıl yapacağımı bilmek istiyorum: keserek ve yuvarlayarak. Ve verimli bir şekilde, bir dizeye dönüştürme ve ayrıştırma yoluyla değil.
Yanıtlar:
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
Olumsuz
// 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
Pozitif - Daha büyük sayılar
// 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
Negatif - Büyük sayılar
// 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;
. Notasyonu senin zevke gizleyebilir çok ise, sadece bir işlevde gizlemek: function toInt(value) { return ~~value; }
. (Eğer bunu önemsiyorsanız, bu aynı zamanda dizeleri tamsayılara dönüştürür.)
Math.trunc(val);
Yorum çünkü bu kabul edilen cevaptır
2.3 - 2.3 % 1
Bir bitsel veya operatör kayan nokta rakamlarını kısaltmak için kullanılabilir ve pozitifler ve negatifler için çalışır:
function float2int (value) {
return value | 0;
}
Sonuçlar
float2int(3.1) == 3
float2int(-3.1) == -3
float2int(3.9) == 3
float2int(-3.9) == -3
Arasında performansı karşılaştıran bir JSPerf testi oluşturdum :
Math.floor(val)
val | 0
bitsel VEYA~~val
bitsel DEĞİLparseInt(val)
sadece pozitif sayılarla çalışır. Bu durumda, Math.floor
fonksiyonun yanı sıra bitsel işlemleri de kullanabilirsiniz .
Ancak , negatiflerin yanı sıra pozitiflerle çalışmak için kodunuza ihtiyacınız varsa , en hızlı şekilde bitsel işlem (VEYA tercih edilen yöntemdir). Bu diğer JSPerf testi , Math'ın ek işaret kontrolü nedeniyle şimdi dördün en yavaş olduğu oldukça açık olanı karşılaştırıyor .
Yorumlarda belirtildiği gibi, BITWISE operatörleri imzalı 32 bit tamsayılarda çalışır, bu nedenle büyük sayılar dönüştürülür, örnek:
1234567890 | 0 => 1234567890
12345678901 | 0 => -539222987
Math.floor()
, daha hızlıdır (en azından Google Chrome'da ilk JSPerf testinizi çalıştırmamıza göre , sürüm 30.0.1599.101), daha sağlamdır (çünkü sayıların bit cinsinden nasıl temsil edildiğine bağlı değildir, ve bu bitsel çözümü değiştirebilir ve bozabilir) ve en önemlisi daha açıktır.
~~
daha iyi çünkü tek bir operatör. 4.2|0+4
eşittir 4
ama ~~4.2+4
eşittir8
Not: Math.floor()
Kesmek için yedek olarak kullanamazsınız , çünkü Math.floor(-3.1) = -4
değil -3
!
Kesme için doğru değiştirme:
function truncate(value)
{
if (value < 0) {
return Math.ceil(value);
}
return Math.floor(value);
}
Math.trunc(value)
ECMAScript 6
floor
sonsuzluğa truncate
yuvarlar, sıfıra yuvarlar. ( ceil
+ sonsuza doğru yuvarlar).
Şamandıraları kısaltmak için çift bitsel olmayan bir operatör kullanılabilir. Bahsettiğiniz diğer işlemler mevcut aracılığıyla vardır Math.floor
, Math.ceil
ve Math.round
.
> ~~2.5
2
> ~~(-1.4)
-1
<canvas>
JS yazı tipi oluşturma motorunu . Teşekkür ederim!
Kesmek için:
var intvalue = Math.floor(value);
Tur için:
var intvalue = Math.round(value);
Yuvarlama olmadan parseInt yöntemini kullanabilirsiniz . 0x (onaltılık) ve 0 (sekizli) önek seçenekleri nedeniyle kullanıcı girişine dikkat edin.
var intValue = parseInt(floatValue, 10);
parseInt(1000000000000000000000, 10);
1 değil, 1 000 000 000 000 000 000 000 000 ile sonuçlanır. Her neyse, soru açıkça " bir dizeye dönüştürme ve ayrıştırma " istemiyordu , ancak bu nispeten küçük ...;)
parseInt()
beklemesidir . Bu tamsayı geçtiğinizde, bu dönüştürülür ve daha sonra dize ayrıştırır , sonuçları . 1e21
parseInt
1e21
1
1'e bölünmeye eşdeğer olan 0 ile bit kaydırma
// >> or >>>
2.0 >> 0; // 2
2.0 >>> 0; // 2
>> 0
sadece < 2 ^ 31-1>>> 0
tamsayıları ve < 2 ^ 32-1 tamsayıları için çalışıyor gibi görünüyor . Bu, daha büyük değerler için 0 değerini döndürür
Sizin durumunuzda, sonunda bir virgül kullanmak istediğinizde (virgül eklemek için), sadece Number.toFixed()
işlevi kullanabilirsiniz , ancak bu yuvarlama gerçekleştirecektir.
Burada birçok öneri var. Bitsel VEYA açık ara en basit gibi görünüyor. Modulo operatörünü kullanarak da negatif sayılarla çalışan başka bir kısa çözüm. Anlamak muhtemelen bitsel VEYA'dan daha kolaydır:
intval = floatval - floatval%1;
Bu yöntem aynı zamanda '| 0' veya '~~' veya '>> 0'ın doğru çalışmadığı yüksek değer sayılarıyla da çalışır:
> n=4294967295;
> n|0
-1
> ~~n
-1
> n>>0
-1
> n-n%1
4294967295
To kesmek :
// 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
To turda :
Math.round( 1.5 ); // 2
Math.round( 1.49 ); // 1
Math.round( -1.6 ); // -2
Math.round( -1.3 ); // -1
Olası bir yol daha - XOR işlemini kullanın:
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
Bitsel işlemlerin önceliği matematik işlemlerinin önceliğinden daha azdır, yararlıdır. Https://jsfiddle.net/au51uj3r/ adresinde deneyin
Math
JavaScript'te yerel nesneye bakarsanız , sayılar ve değerler vb. Üzerinde çalışmak için tüm işlevleri alırsınız ...
Temel olarak JavaScript'te yapmak istediğiniz şey oldukça basit ve yerel ...
Aşağıdaki numaraya sahip olduğunuzu düşünün:
const myValue = 56.4534931;
ve şimdi en yakın sayıya yuvarlamak istiyorsanız, yapmanız yeterli:
const rounded = Math.floor(myValue);
ve elde edersiniz:
56
En yakın sayıya yuvarlamak istiyorsanız, yapmanız gerekenler:
const roundedUp = Math.ceil(myValue);
ve elde edersiniz:
57
Ayrıca Math.round
, daha yüksek veya daha düşük sayıya yuvarlamak, hangisinin flot numarasına daha yakın olduğuna bağlıdır.
Ayrıca ~~
, bir float'ı tam sayıya dönüştürecek olan float numarasının arkasında da kullanabilirsiniz .
Gibi kullanabilirsiniz ~~myValue
...
~~
çünkü sayı int 32 sınırından büyükse, değeri int 32 sınır değerine değiştirecektir.
//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
Sadece parasal olarak kırpmak istediğinizi belirtmek istiyorum. 4.999452 * 100 yuvarlatılmış size 5, daha temsili bir cevap vereceğinden, bir kuruş tarafından kapalı olmak daha az olasıdır.
Bunun da ötesinde , bankacının yuvarlamasını unutmayın , bu da düz yuvarlamanın verdiği hafif pozitif önyargılara karşı koymanın bir yoludur - finansal uygulamanız bunu gerektirebilir.
Angularjs kullanıyorsanız, HTML Şablon Bağlamasında aşağıdaki gibi basit bir çözüm
{{val | number:0}}
val tamsayıya dönüşür
bu bağlantıyı kullanarak docs.angularjs.org/api/ng/filter/number