Bagaimana saya bisa menghapus bagian desimal dari nomor JavaScript?

218

Saya memiliki hasil pembagian dan saya ingin membuang bagian desimal dari angka yang dihasilkan.

Bagaimana saya bisa melakukan ini?

JacobTheDev
sumber

Jawaban:

384

Anda bisa menggunakan ...

... tergantung pada bagaimana Anda ingin menghapus desimal.

Math.trunc()belum didukung pada semua platform (yaitu IE), tetapi sementara itu Anda dapat menggunakan polyfill .

Metode lain untuk memotong bagian fraksional dengan dukungan platform yang sangat baik adalah dengan menggunakan operator bitwise (.eg |0). Efek samping dari menggunakan operator bitwise pada angka adalah ia akan memperlakukan operand sebagai integer 32bit yang ditandatangani, oleh karena itu menghilangkan komponen fraksional. Perlu diingat ini juga akan memotong angka lebih besar dari 32 bit.


Anda mungkin juga berbicara tentang ketidaktepatan pembulatan desimal dengan aritmatika floating point.

Bacaan Wajib - Yang Harus Diketahui Setiap Ilmuwan Komputer Tentang Aritmatika Titik Apung .

alex
sumber
29
Ingatlah bahwa itu Math.floor()akan meningkatkan nilai numerik ketika angka negatif . Jadi Math.floor(-1.2) -> -2sementara Math.floor(1.2) -> 1. parseInt(-1.2) -> -1( seperti yang disebutkan oleh @FloydPink ) akan membuang bagian desimal seperti yang diharapkan untuk angka positif dan negatif .
Paul T. Rawkeen
1
@ PaulT.Rawkeen Anda juga bisa menggunakan operator bitwise untuk menjatuhkan bagian desimal, tetapi perlu diingat ini juga dipotong menjadi 32 bit.
Alex
2
berikut ini menunjukkan jawaban ini tidak stabil:> (2.305*100)|0 > 230 > (2.3*100)|0 > 229
Jake
4
@ Jake Hasil dari 2.3*100dalam javascript adalah 229.99999999999997, jadi sepertinya operator bitwise melakukan tugasnya dengan benar dalam contoh Anda.
Chad von Nau
Apakah ada solusi serupa dengan |0yang menggunakan integer 64bit?
Clint
49

Anda juga dapat menggunakan operator bitwise untuk memotong desimal.

misalnya

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

Operasi bitwise jauh lebih efisien daripada fungsi Matematika. Operator ganda bukan bitwise juga tampaknya sedikit mengungguli operasi x | 0dan x << 0bitwise dengan jumlah yang dapat diabaikan.

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

Juga patut dicatat adalah bahwa operator bitwise bukan diutamakan daripada operasi aritmatika, jadi Anda mungkin perlu mengelilingi perhitungan dengan tanda kurung untuk mendapatkan hasil yang diinginkan:

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

Info lebih lanjut tentang operator bitwise ganda tidak dapat ditemukan di Bitwise ganda TIDAK (~~)

Braden Steffaniak
sumber
2
Mungkin sedikit efisien. Tapi, saya akan menyarankan fungsi 'Matematika', karena lebih mudah dibaca.
ashipj
Kemungkinannya adalah ini tidak berfungsi jika integer tidak direpresentasikan sebagai integer bertanda 32-bit ( stackoverflow.com/a/7488075/3655192 )
Hiroki
30

Anda juga bisa melakukannya

parseInt(a/b)
Hari Pachuveetil
sumber
17
Perhatikan bahwa parseInttidak akan bekerja dengan andal untuk angka besar, karena ia bekerja dengan terlebih dahulu mengonversi argumennya menjadi string, dan untuk angka besar hasilnya akan menggunakan notasi eksponensial. Misalnya: var n = 22222222222222222222222; parseInt(n);akan kembali 2, karena n.toString()kembali 2.2222222222222223e+22.
2
Ini juga tidak menggunakan parseInt()untuk tujuannya, yaitu untuk mengambil angka dalam string dan mengembalikan a Number.
alex
22

Anda juga dapat menunjukkan jumlah digit tertentu setelah titik desimal (di sini 2 digit) menggunakan kode berikut:

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

Mahdi ghafoorian
sumber
4
Ketahuilah bahwa toFixed () mengembalikan sebuah String, bukan sebuah Angka. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Jeanmichel Cote
1
Bagaimana ini merupakan jawaban ketika OP meminta untuk menghapus bagian desimal
Isaac
3
Meskipun mengembalikan string, Anda bisa menggunakan metode Number () untuk memperbaikinya .. Number ((15.46974) .toFixed (2))
iPzard
13

Gunakan Math.round()fungsi.

Math.round(65.98) // will return 66 
Math.round(65.28) // will return 65
Navdeep Singh
sumber
17
Untuk kelengkapan, ini adalah JavaScript biasa, bukan permintaan.
Dave Newton
1
$.round = Math.round;)
alex
12

Gunakan Math.round().

(Jawaban Alex lebih baik; saya membuat asumsi :)

Dave Newton
sumber
6

Dengan ES2015, Math.trunc () tersedia.

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

Ini tidak didukung di IE11 atau di bawah, tetapi berfungsi di Edge dan setiap browser modern lainnya.

Chad von Nau
sumber
2
Tahu ada variasi yang memungkinkan untuk memotong ke tempat desimal X? Apakah naif jika berpikir itu Math.trunc(value * Math.pow(10,x)) / Math.pow(10,x)akan berhasil?
jamiebarrow
2
Hei Jamie, sepertinya itu akan bekerja untuk sebagian besar kasus, tetapi rentan terhadap gotcha titik mengambang. mis value = 2.3dan x = 2akan kembali 2.29. Saya tidak punya saran yang lebih baik.
Chad von Nau
Bagi saya ini sepertinya jawaban yang tepat. Tidak ada pembulatan atas atau bawah. Tidak ada masalah dengan angka negatif. Buang desimal. Seperti pertanyaan yang diajukan.
Tenda Enrique Moreno
2

Jika Anda tidak peduli tentang rouding, cukup konversikan angka menjadi string, lalu hapus semuanya setelah periode termasuk periode. Ini berfungsi apakah ada desimal atau tidak.

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

toFixed akan berperilaku seperti putaran.

Untuk lantai suka perilaku gunakan%:

var num = 3.834234;
var floored_num = num - (num % 1); // floored_num will be 3
Shahar H
sumber
2
Mengapa Anda merasa ini lebih baik daripada menggunakan Math.floor? Solusi Anda tampaknya tidak perlu rumit, dan lambat. Saya tidak tahu cara kerja Math.floor, tapi saya berharap ini akan lebih dioptimalkan. Juga, saya ingin tahu apakah solusi Anda mungkin menderita kesalahan pembulatan titik mengambang.
Hans Roerdinkholder
1

Berikut ini adalah tekan dalam penjelasan rinci dengan bantuan posting di atas:

1. Math.trunc (): Digunakan untuk menghapus angka-angka yang diikuti oleh titik. Konversi secara implisit. Tapi, tidak didukung di IE.

Contoh:

Math.trunc (10.5) // 10

Math.trunc (-10.5) // -10

Cara Alternatif lain: Penggunaan bitwise bukan operator:

Contoh:

x = 5.5

~~ x // 5

2. Math.floor (): Digunakan untuk memberikan nilai integer minimum yang mungkin. Ini didukung di semua browser.

Contoh:

Math.floor (10.5) // 10

Math.floor (-10.5) // -11

3. Math.ceil (): Digunakan untuk memberikan nilai integer setinggi mungkin. Ini didukung di semua browser.

Contoh:

Math.ceil (10.5) // 11

Math.ceil (-10.5) // -10

4. Math.round (): Dibulatkan ke bilangan bulat terdekat. Ini didukung di semua browser.

Contoh:

Math.round (10.5) // 11

Math.round (-10.5) // -10

Math.round (10.49) // 10

Math.round (-10.51) // -11

sreepurna
sumber
0

Untuk implementasi ES6, gunakan sesuatu seperti berikut ini:

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

Ini untuk mereka yang ingin mencegah pengguna memasukkan angka desimal

<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>
Masoud Darvishian
sumber
0

Anda dapat menggunakan .toFixed (0) untuk menghapus bagian desimal lengkap atau memberikan angka dalam argumen hingga Anda ingin desimal dipotong.

Catatan: toFixed akan mengubah angka menjadi string.

Nikhil Kamani
sumber
0

Sebagai contoh:

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 

atau

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  
kelly k audrey
sumber