Saya baru-baru ini memperhatikan bahwa int()
putaran float ke arah 0, sedangkan divisi integer putaran float ke lantai.
contohnya:
-7 // 2 = -4
int(-7/2) = -3
Saya telah membaca dokumentasi yang menjelaskan:
kelas int (x, basis = 10)
Kembalikan objek integer yang dibangun dari angka atau string x, atau kembalikan 0 jika tidak ada argumen yang diberikan>. Jika x adalah angka, kembalikan x. int (). Untuk angka floating point, ini memotong menuju nol.
dan:
divisi lantai
Divisi matematika yang membulatkan ke bilangan bulat terdekat. Operator divisi lantai adalah //. Misalnya, ekspresi 11 // 4 mengevaluasi ke 2 berbeda dengan 2,75 yang dikembalikan oleh float true division. Perhatikan bahwa (-11) // 4 adalah -3 karena itu adalah -2.75 dibulatkan ke bawah. Lihat PEP 238.
Tetapi tampaknya tidak masuk akal bagi saya bahwa 2 operasi serupa (float division to integer) harus mengembalikan hasil yang berbeda.
Apakah ada motivasi untuk perbedaan antara fungsi?
Terima kasih.
sumber
Jawaban:
Konsistensi.
Anda harus mengikuti beberapa penjelasan yang sangat mendasar dan tampaknya tidak relevan untuk memahaminya.
Di sekolah Anda telah belajar pembagian dengan sisanya. Dan Anda telah melakukan perhitungan seperti ini:
Kemudian, Anda telah mempelajari pembagian untuk bilangan real:
Sampai titik ini, Anda mungkin percaya itu
x // 4
danint(x/4)
selalu memberikan hasil yang sama. Itulah pemahaman Anda tentang situasi saat ini.Namun, lihat apa yang terjadi di divisi bilangan bulat: angka di belakang R siklus dari 3, 2, 1 ke 0 dan kemudian restart: 3, 2, 1, 0. Angka di depan R menurun setiap langkah ke-4.
Jadi, bagaimana kelanjutannya?
Pada saat yang sama, pembagian bilangan real memberi kita:
Itu sebabnya
-1 // 4
memberi -1 tetapiint(-1/4)
memberi 0.Yah, mereka melayani tujuan yang berbeda:
//
adalah bagian dari perhitungan bilangan bulat dengan sisa danint()
memberi Anda bagian di depan.
operasi bilangan real.Anda memutuskan apa yang ingin Anda hitung, maka Anda memutuskan operator mana yang akan digunakan dalam Python untuk mendapatkan hasil yang benar.
Pertanyaan bagus. Teruslah belajar.
sumber
//
operator di python 3 adalah untuk menghindari memaksa penggunaan int (float). Jika ini tidak terjadi, kapan saya harus memilih untuk menerapkan menggunakanint()
dan kapan saya harus menerapkan menggunakan//
Math.Floor(3.23) != -Math.Floor(-3.23)
Untuk alasan yang sama-((-x)//y)
tidak perlu samax//y
.Saya akan mengatakan bahwa pengamatan Anda bahwa kedua operasi tersebut harus serupa secara intuitif diharapkan karena pada angka positif mereka berperilaku identik. Tetapi jika Anda melihat asal-usul mereka (satu berasal dari matematika dan yang lainnya dari ilmu komputer) maka lebih masuk akal perilaku mereka yang berbeda.
Anda dapat melihat konsep di belakang sana:
================================================== ================
I) Divisi lantai alias fungsi lantai diterapkan ke divisi matematika
Fungsi lantai adalah konsep yang sangat mapan dalam matematika.
Dari mathworld.wolfram :
Jadi pembagian lantai tidak lebih dari fungsi lantai yang diterapkan pada pembagian matematika. Perilaku ini sangat jelas, "tepat secara matematis".
II) Jenis konversi / Jenis casting
Dari wikipedia :
Di sebagian besar bahasa pemrograman, bentuk casting float to integer diterapkan oleh aturan pembulatan (jadi ada konvensi):
Aturan pembulatan menurut IEEE 754 .
Jadi, dengan kata lain, alasan untuk perbedaan antara pembagian bilangan bulat dan float ke konversi int dengan python adalah matematika, berikut adalah beberapa pemikiran dari Guido van Rossum (saya kira saya tidak harus memperkenalkannya: D) (dari blog Sejarah Python, artikel "Mengapa Lantai Divisi Integer Python" )
sumber