Saya memiliki hasil pembagian dan saya ingin membuang bagian desimal dari angka yang dihasilkan.
Bagaimana saya bisa melakukan ini?
Saya memiliki hasil pembagian dan saya ingin membuang bagian desimal dari angka yang dihasilkan.
Bagaimana saya bisa melakukan ini?
Jawaban:
Anda bisa menggunakan ...
Math.trunc() (memotong bagian pecahan, juga lihat di bawah)Math.floor() (dibulatkan ke bawah)Math.ceil() (pembulatan) Math.round() (bulat ke bilangan bulat terdekat)... 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 .
> (2.305*100)|0 > 230 > (2.3*100)|0 > 229
2.3*100dalam javascript adalah 229.99999999999997, jadi sepertinya operator bitwise melakukan tugasnya dengan benar dalam contoh Anda.
|0yang menggunakan integer 64bit?
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 (~~)
Anda juga bisa melakukannya
parseInt(a/b)
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.
parseInt()untuk tujuannya, yaitu untuk mengambil angka dalam string dan mengembalikan a Number.
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
Gunakan Math.round()fungsi.
Math.round(65.98) // will return 66
Math.round(65.28) // will return 65
$.round = Math.round;)
Gunakan Math.round().
(Jawaban Alex lebih baik; saya membuat asumsi :)
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.
Math.trunc(value * Math.pow(10,x)) / Math.pow(10,x)akan berhasil?
value = 2.3dan x = 2akan kembali 2.29. Saya tidak punya saran yang lebih baik.
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
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
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>
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.
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
Math.floor()akan meningkatkan nilai numerik ketika angka negatif . JadiMath.floor(-1.2) -> -2sementaraMath.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 .