0,0 hingga 0 dengan python

Ini adalah era data besar, dan setiap hari semakin banyak bisnis yang mencoba memanfaatkan data mereka untuk membuat keputusan yang tepat. Banyak bisnis beralih ke ekosistem ilmu data kuat Python untuk menganalisis data mereka, sebagaimana dibuktikan dengan meningkatnya popularitas Python di ranah ilmu data

Satu hal yang harus diingat oleh setiap praktisi ilmu data adalah bagaimana kumpulan data dapat menjadi bias. Menarik kesimpulan dari data yang bias dapat menyebabkan kesalahan yang mahal

Ada banyak cara bias dapat menyusup ke dalam kumpulan data. Jika Anda telah mempelajari beberapa statistik, Anda mungkin akrab dengan istilah seperti bias pelaporan, bias pemilihan, dan bias pengambilan sampel. Ada jenis bias lain yang memainkan peran penting saat Anda berurusan dengan data numerik. bias pembulatan

Pada artikel ini, Anda akan belajar

  • Mengapa cara Anda membulatkan angka itu penting
  • Cara membulatkan angka menurut berbagai strategi pembulatan, dan cara mengimplementasikan setiap metode dengan Python murni
  • Bagaimana pembulatan memengaruhi data, dan strategi pembulatan mana yang meminimalkan efek ini
  • Cara membulatkan angka dalam array NumPy dan Pandas DataFrames
  • Kapan menerapkan strategi pembulatan yang berbeda

Ikuti Kuis. Uji pengetahuan Anda dengan kuis "Angka Pembulatan dengan Python" interaktif kami. Setelah selesai Anda akan menerima skor sehingga Anda dapat melacak kemajuan belajar Anda dari waktu ke waktu

Ikuti Kuis »

Artikel ini bukan risalah tentang presisi numerik dalam komputasi, meskipun kami akan membahasnya secara singkat. Hanya keakraban dengan dasar-dasar Python yang diperlukan, dan matematika yang terlibat di sini harus terasa nyaman bagi siapa pun yang akrab dengan aljabar sekolah menengah yang setara.

Mari kita mulai dengan melihat mekanisme pembulatan bawaan Python

Fungsi def truncate(n, decimals=0): multiplier = 10 ** decimals return int(n * multiplier) / multiplier _9 Built-in Python

Python memiliki fungsi

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
9 bawaan yang mengambil dua argumen numerik,
>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
1 dan
>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
2, dan mengembalikan angka
>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
1 dibulatkan menjadi
>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
2. Argumen
>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
_2 default ke nol, jadi meninggalkannya menghasilkan angka yang dibulatkan menjadi bilangan bulat. Seperti yang akan Anda lihat,
def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
9 mungkin tidak berfungsi seperti yang Anda harapkan

Cara kebanyakan orang diajari untuk membulatkan angka kira-kira seperti ini

Membulatkan angka

>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
1 menjadi
>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
8 tempat desimal dengan terlebih dahulu menggeser titik desimal di
>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
1 dengan
>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
8 tempat dengan mengalikan
>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
1 dengan 10ᵖ (10 dipangkatkan
>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
8) untuk mendapatkan angka baru
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
3

Kemudian lihat angka

>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
_4 di tempat desimal pertama dari
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
3. Jika
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
_4 kurang dari 5, bulatkan
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
3 ke bawah ke bilangan bulat terdekat. Jika tidak, bulatkan
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
_3 ke atas

Terakhir, geser titik desimal ke belakang

>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
_8 tempat dengan membagi
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
3 dengan 10ᵖ

Ini adalah algoritma yang mudah. Misalnya, angka

>>> import math

>>> math.ceil(1.2)
2

>>> math.ceil(2)
2

>>> math.ceil(-0.5)
0
1 yang dibulatkan ke bilangan bulat terdekat adalah
>>> import math

>>> math.ceil(1.2)
2

>>> math.ceil(2)
2

>>> math.ceil(-0.5)
0
2. Angka
>>> import math

>>> math.ceil(1.2)
2

>>> math.ceil(2)
2

>>> math.ceil(-0.5)
0
3 dibulatkan menjadi satu tempat desimal adalah
>>> import math

>>> math.ceil(1.2)
2

>>> math.ceil(2)
2

>>> math.ceil(-0.5)
0
4

Sekarang buka sesi juru bahasa dan bulatkan

>>> import math

>>> math.ceil(1.2)
2

>>> math.ceil(2)
2

>>> math.ceil(-0.5)
0
1 ke bilangan bulat terdekat menggunakan fungsi bawaan Python

>>>

>>> round(2.5)
2
_

Terkesiap

Bagaimana

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
_9 menangani nomor
>>> import math

>>> math.ceil(1.2)
2

>>> math.ceil(2)
2

>>> math.ceil(-0.5)
0
8?

>>>

>>> round(1.5)
2
_

Jadi,

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
_9 putaran
>>> import math

>>> math.ceil(1.2)
2

>>> math.ceil(2)
2

>>> math.ceil(-0.5)
0
8 hingga
>>> round(1.5)
2
01, dan
>>> import math

>>> math.ceil(1.2)
2

>>> math.ceil(2)
2

>>> math.ceil(-0.5)
0
1 hingga
>>> round(1.5)
2
01

Sebelum Anda mengangkat masalah pada pelacak bug Python, izinkan saya meyakinkan Anda bahwa

>>> round(1.5)
2
04 seharusnya mengembalikan
>>> round(1.5)
2
01. Ada alasan bagus mengapa
def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
_9 berperilaku seperti itu

Dalam artikel ini, Anda akan belajar bahwa ada lebih banyak cara untuk membulatkan angka daripada yang mungkin Anda duga, masing-masing dengan keuntungan dan kerugian yang unik.

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
9 berperilaku sesuai dengan strategi pembulatan tertentu—yang mungkin atau mungkin bukan strategi yang Anda butuhkan untuk situasi tertentu

Anda mungkin bertanya-tanya, "Bisakah cara saya membulatkan angka benar-benar berdampak sebesar itu?"

Hilangkan iklan

Seberapa Besar Dampak Pembulatan?

Misalkan Anda mengalami hari yang sangat beruntung dan menemukan $100 di lapangan. Daripada menghabiskan semua uang Anda sekaligus, Anda memutuskan untuk memainkannya dengan cerdas dan menginvestasikan uang Anda dengan membeli beberapa lembar saham yang berbeda

Nilai saham tergantung pada penawaran dan permintaan. Semakin banyak orang yang ingin membeli suatu saham, maka semakin banyak pula nilai saham tersebut, begitu pula sebaliknya. Di pasar saham volume tinggi, nilai saham tertentu dapat berfluktuasi setiap detik

Mari kita jalankan eksperimen kecil. Kami akan menganggap nilai keseluruhan saham yang Anda beli berfluktuasi dengan angka acak kecil setiap detik, katakanlah antara $0. 05 dan -$0. 05. Fluktuasi ini belum tentu menjadi nilai yang bagus dengan hanya dua tempat desimal. Misalnya, nilai keseluruhan dapat meningkat sebesar $0. 031286 satu detik dan kurangi detik berikutnya sebesar $0. 028476

Anda tidak ingin melacak nilai Anda ke tempat desimal kelima atau keenam, jadi Anda memutuskan untuk memotong semuanya setelah tempat desimal ketiga. Dalam jargon pembulatan, ini disebut memotong angka ke tempat desimal ketiga. Ada beberapa kesalahan yang diharapkan di sini, tetapi dengan mempertahankan tiga angka desimal, kesalahan ini tidak akan signifikan. Benar?

Untuk menjalankan percobaan kami menggunakan Python, mari kita mulai dengan menulis fungsi

>>> round(1.5)
2
08 yang memotong angka menjadi tiga tempat desimal

>>>

>>> def truncate(n):
..     return int(n * 1000) / 1000
_

Fungsi

>>> round(1.5)
2
_08 bekerja dengan terlebih dahulu menggeser titik desimal pada angka
>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
1 tiga tempat ke kanan dengan mengalikan
>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
1 dengan
>>> round(1.5)
2
12. Bagian bilangan bulat dari nomor baru ini diambil dengan
>>> round(1.5)
2
13. Terakhir, titik desimal digeser tiga tempat ke belakang ke kiri dengan membagi
>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
1 dengan
>>> round(1.5)
2
12

Selanjutnya, mari kita tentukan parameter awal simulasi. Anda memerlukan dua variabel. satu untuk melacak nilai sebenarnya dari saham Anda setelah simulasi selesai dan satu untuk nilai saham Anda setelah Anda memotong ke tiga tempat desimal di setiap langkah

Mulailah dengan menginisialisasi variabel-variabel ini ke

>>> round(1.5)
2
16

>>>

>>> actual_value, truncated_value = 100, 100
_

Sekarang mari jalankan simulasi selama 1.000.000 detik (sekitar 11. 5 hari). Untuk setiap detik, hasilkan nilai acak antara

>>> round(1.5)
2
17 dan
>>> round(1.5)
2
18 dengan fungsi
>>> round(1.5)
2
19 di modul
>>> round(1.5)
2
20, lalu perbarui
>>> round(1.5)
2
21 dan
>>> round(1.5)
2
22

>>>

>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
_

Daging dari simulasi berlangsung di

>>> round(1.5)
2
23 loop, yang loop di atas
>>> round(1.5)
2
24 nomor antara
>>> round(1.5)
2
25 dan
>>> round(1.5)
2
26. Nilai yang diambil dari
>>> round(1.5)
2
_27 pada setiap langkah disimpan dalam variabel
>>> round(1.5)
2
28, yang kita gunakan di sini karena kita sebenarnya tidak membutuhkan nilai ini di dalam loop

Pada setiap langkah loop, nomor acak baru antara

>>> round(1.5)
2
17 dan
>>> round(1.5)
2
18 dihasilkan menggunakan
>>> round(1.5)
2
31 dan ditugaskan ke variabel
>>> round(1.5)
2
32. Nilai baru investasi Anda dihitung dengan menambahkan
>>> round(1.5)
2
32 ke
>>> round(1.5)
2
34, dan total terpotong dihitung dengan menambahkan
>>> round(1.5)
2
32 ke
>>> round(1.5)
2
36 dan kemudian memotong nilai ini dengan
>>> round(1.5)
2
08

Seperti yang Anda lihat dengan memeriksa variabel

>>> round(1.5)
2
_34 setelah menjalankan loop, Anda hanya kehilangan sekitar $3. 55. Namun, jika Anda telah melihat ________30______36, Anda akan berpikir bahwa Anda telah kehilangan hampir semua uang Anda

Catatan. Dalam contoh di atas, fungsi

>>> round(1.5)
2
_40 digunakan untuk menyemai generator bilangan acak semu sehingga Anda dapat mereproduksi keluaran yang ditunjukkan di sini

Untuk mempelajari lebih lanjut tentang keacakan di Python, lihat Real Python Menghasilkan Data Acak di Python (Panduan)

Abaikan sejenak bahwa

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
_9 tidak berperilaku seperti yang Anda harapkan, mari coba jalankan kembali simulasi. Kami akan menggunakan
def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
_9 kali ini untuk membulatkan ke tiga desimal pada setiap langkah, dan
>>> round(1.5)
2
43 simulasi lagi untuk mendapatkan hasil yang sama seperti sebelumnya

>>>

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
_

Apa bedanya

Mengejutkan seperti yang terlihat, kesalahan yang tepat ini menyebabkan kehebohan di awal 1980-an ketika sistem yang dirancang untuk mencatat nilai Bursa Efek Vancouver memotong nilai indeks keseluruhan menjadi tiga tempat desimal alih-alih pembulatan. Kesalahan pembulatan telah mempengaruhi pemilu dan bahkan mengakibatkan hilangnya nyawa

Cara Anda membulatkan angka itu penting, dan sebagai pengembang dan perancang perangkat lunak yang bertanggung jawab, Anda perlu mengetahui apa masalah umumnya dan cara mengatasinya. Mari selami dan selidiki apa saja metode pembulatan yang berbeda dan bagaimana Anda dapat mengimplementasikan masing-masing dengan Python murni

Hilangkan iklan

Kumpulan Metode

Ada banyak strategi pembulatan, masing-masing dengan kelebihan dan kekurangan. Di bagian ini, Anda akan mempelajari beberapa teknik yang paling umum, dan bagaimana teknik tersebut dapat memengaruhi data Anda

Pemotongan

Metode yang paling sederhana, meskipun paling kasar, untuk membulatkan angka adalah memotong angka menjadi sejumlah digit tertentu. Saat Anda memotong angka, Anda mengganti setiap digit setelah posisi tertentu dengan 0. Berikut beberapa contohnya

NilaiTerpotong Ke Hasil12. 345 Tempat puluhan1012. 345Tempat One1212. 345 Tempat persepuluhan12. 312. 345 Tempat keseratus12. 34

Anda telah melihat satu cara untuk mengimplementasikan ini di fungsi

>>> round(1.5)
2
08 dari bagian. Dalam fungsi itu, nomor input dipotong menjadi tiga angka desimal

  • Mengalikan angka dengan
    >>> round(1.5)
    2
    
    _12 untuk menggeser titik desimal tiga tempat ke kanan
  • Mengambil bagian bilangan bulat dari nomor baru itu dengan
    >>> round(1.5)
    2
    
    13
  • Menggeser tempat desimal tiga tempat ke belakang ke kiri dengan membaginya dengan
    >>> round(1.5)
    2
    
    12

Anda dapat menggeneralisasi proses ini dengan mengganti

>>> round(1.5)
2
12 dengan angka 10ᵖ (
>>> round(1.5)
2
49 dipangkatkan pth), di mana p adalah jumlah tempat desimal untuk dipotong menjadi

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier

Dalam versi

>>> round(1.5)
2
08 ini, argumen kedua default ke
>>> round(1.5)
2
25 sehingga jika tidak ada argumen kedua yang diteruskan ke fungsi, maka
>>> round(1.5)
2
08 mengembalikan bagian bilangan bulat dari angka berapa pun yang diteruskan ke fungsi tersebut

Fungsi

>>> round(1.5)
2
_08 bekerja dengan baik untuk bilangan positif dan negatif

>>>

>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
_

Anda bahkan dapat meneruskan angka negatif ke

>>> round(1.5)
2
54 untuk memotong ke digit di sebelah kiri titik desimal

>>>

>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
_

Saat Anda memotong angka positif, Anda membulatkannya ke bawah. Demikian pula, memotong angka negatif akan membulatkan angka tersebut. Dalam artian, pemotongan adalah gabungan dari cara pembulatan tergantung dari tanda angka yang Anda bulatkan

Mari kita lihat masing-masing metode pembulatan ini satu per satu, dimulai dengan pembulatan

Membulatkan

Strategi pembulatan kedua yang akan kita lihat disebut “pembulatan. ” Strategi ini selalu membulatkan angka hingga sejumlah digit tertentu. Tabel berikut merangkum strategi ini

NilaiBulatkan Ke Hasil12. 345 Tempat Puluhan2012. 345 Tempat seseorang1312. 345 Tempat persepuluhan12. 412. 345 Tempat keseratus12. 35

Untuk menerapkan strategi "pembulatan" dengan Python, kami akan menggunakan fungsi dari modul

>>> round(1.5)
2
56

Fungsi

>>> round(1.5)
2
_55 mendapatkan namanya dari istilah "plafon", yang digunakan dalam matematika untuk menjelaskan bilangan bulat terdekat yang lebih besar dari atau sama dengan angka yang diberikan

Setiap angka yang bukan bilangan bulat terletak di antara dua bilangan bulat berurutan. Misalnya, angka

>>> round(1.5)
2
58 terletak pada interval antara
>>> round(1.5)
2
59 dan
>>> round(1.5)
2
01. "Plafon" adalah yang lebih besar dari dua titik akhir interval. Yang lebih rendah dari dua titik akhir disebut "lantai". ” Jadi, langit-langit
>>> round(1.5)
2
_58 adalah
>>> round(1.5)
2
01, dan lantai
>>> round(1.5)
2
58 adalah
>>> round(1.5)
2
59

Dalam matematika, fungsi khusus yang disebut fungsi langit-langit memetakan setiap angka ke langit-langitnya. Untuk memungkinkan fungsi plafon menerima bilangan bulat, batas atas bilangan bulat didefinisikan sebagai bilangan bulat itu sendiri. Jadi, plafon dari bilangan

>>> round(1.5)
2
_01 adalah
>>> round(1.5)
2
01

Dalam Python,

>>> round(1.5)
2
67 mengimplementasikan fungsi langit-langit dan selalu mengembalikan bilangan bulat terdekat yang lebih besar dari atau sama dengan inputnya

>>>

>>> import math

>>> math.ceil(1.2)
2

>>> math.ceil(2)
2

>>> math.ceil(-0.5)
0
_

Perhatikan bahwa langit-langit

>>> round(1.5)
2
68 adalah
>>> round(1.5)
2
25, bukan
>>> round(1.5)
2
70. Ini masuk akal karena
>>> round(1.5)
2
25 adalah bilangan bulat terdekat dengan
>>> round(1.5)
2
68 yang lebih besar atau sama dengan
>>> round(1.5)
2
68

Mari tulis fungsi yang disebut

>>> round(1.5)
2
_74 yang menerapkan strategi "pembulatan"

>>> round(1.5)
2
0

Anda mungkin memperhatikan bahwa

>>> round(1.5)
2
_74 sangat mirip dengan
>>> round(1.5)
2
08. Pertama, titik desimal di
>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
_1 digeser ke kanan dengan jumlah tempat yang benar dengan mengalikan
>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
1 dengan
>>> round(1.5)
2
79. Nilai baru ini dibulatkan ke bilangan bulat terdekat menggunakan
>>> round(1.5)
2
67, lalu koma desimal digeser kembali ke kiri dengan membaginya dengan
>>> round(1.5)
2
79

Pola menggeser titik desimal ini, menerapkan beberapa metode pembulatan untuk membulatkan ke bilangan bulat, dan kemudian menggeser kembali titik desimal akan muncul berulang kali saat kami menyelidiki lebih banyak metode pembulatan. Bagaimanapun, ini adalah algoritme mental yang kita gunakan manusia untuk membulatkan angka dengan tangan

Mari kita lihat seberapa baik

>>> round(1.5)
2
_74 berfungsi untuk masukan yang berbeda

>>>

>>> round(1.5)
2
1

Sama seperti

>>> round(1.5)
2
_08, Anda dapat memberikan nilai negatif ke
>>> round(1.5)
2
54

>>>

>>> round(1.5)
2
2

Saat Anda melewatkan angka negatif ke

>>> round(1.5)
2
_54, angka dalam argumen pertama
>>> round(1.5)
2
74 dibulatkan ke jumlah digit yang benar di sebelah kiri titik desimal

Coba tebak apa yang

>>> round(1.5)
2
_87 dikembalikan

>>>

>>> round(1.5)
2
3

Apakah

>>> round(1.5)
2
_88 seperti yang Anda harapkan?

Jika Anda memeriksa logika yang digunakan dalam mendefinisikan

>>> round(1.5)
2
74—khususnya, cara kerja fungsi
>>> round(1.5)
2
67—maka masuk akal bahwa
>>> round(1.5)
2
87 mengembalikan
>>> round(1.5)
2
88. Namun, beberapa orang secara alami mengharapkan simetri sekitar nol saat membulatkan angka, sehingga jika
>>> import math

>>> math.ceil(1.2)
2

>>> math.ceil(2)
2

>>> math.ceil(-0.5)
0
8 dibulatkan menjadi
>>> round(1.5)
2
01, maka
>>> round(1.5)
2
95 harus dibulatkan menjadi
>>> round(1.5)
2
96

Mari kita buat beberapa terminologi. Untuk tujuan kami, kami akan menggunakan istilah "pembulatan" dan "pembulatan ke bawah" menurut diagram berikut

0,0 hingga 0 dengan python
Bulatkan ke kanan dan ke bawah ke kiri. (Gambar. David Amos)

Pembulatan ke atas selalu membulatkan angka ke kanan pada garis bilangan, dan pembulatan ke bawah selalu membulatkan angka ke kiri pada garis bilangan

Hilangkan iklan

Membulatkan ke Bawah

Lawan dari "pembulatan ke atas" adalah strategi "pembulatan ke bawah", yang selalu membulatkan angka ke bawah hingga jumlah digit tertentu. Berikut adalah beberapa contoh yang menggambarkan strategi ini

NilaiDibulatkan Ke Bawah Ke Hasil12. 345 Tempat puluhan1012. 345Tempat One1212. 345 Tempat persepuluhan12. 312. 345 Tempat keseratus12. 34

Untuk menerapkan strategi "pembulatan ke bawah" dengan Python, kita dapat mengikuti algoritme yang sama dengan yang kita gunakan untuk

>>> round(1.5)
2
97 dan
>>> round(1.5)
2
74. Pertama-tama geser titik desimal, lalu bulatkan menjadi bilangan bulat, dan terakhir geser kembali titik desimal

Di

>>> round(1.5)
2
_74, kami menggunakan
>>> round(1.5)
2
67 untuk membulatkan ke atas ke langit-langit angka setelah menggeser titik desimal. Namun, untuk strategi "pembulatan ke bawah", kita perlu membulatkan ke dasar angka setelah menggeser koma desimal

Beruntung bagi kami, modul

>>> round(1.5)
2
_56 memiliki fungsi yang mengembalikan lantai inputnya

>>>

>>> round(1.5)
2
4

Inilah definisi

>>> def truncate(n):
..     return int(n * 1000) / 1000
_03

>>> round(1.5)
2
5

Itu terlihat seperti

>>> round(1.5)
2
74, kecuali
>>> round(1.5)
2
67 telah diganti dengan
>>> def truncate(n):
..     return int(n * 1000) / 1000
06

Anda dapat menguji

>>> def truncate(n):
..     return int(n * 1000) / 1000
03 pada beberapa nilai yang berbeda

>>>

>>> round(1.5)
2
6

Efek dari

>>> round(1.5)
2
74 dan
>>> def truncate(n):
..     return int(n * 1000) / 1000
03 bisa sangat ekstrim. Dengan membulatkan angka dalam kumpulan data besar ke atas atau ke bawah, Anda berpotensi menghilangkan banyak presisi dan secara drastis mengubah perhitungan yang dibuat dari data

Sebelum kita membahas strategi pembulatan lebih lanjut, mari kita berhenti dan luangkan waktu sejenak untuk berbicara tentang bagaimana pembulatan dapat membuat data Anda bias

Selingan. Bias Pembulatan

Anda sekarang telah melihat tiga metode pembulatan.

>>> round(1.5)
2
08,
>>> round(1.5)
2
74, dan
>>> def truncate(n):
..     return int(n * 1000) / 1000
03. Ketiga teknik ini agak kasar dalam hal mempertahankan jumlah presisi yang masuk akal untuk angka tertentu

Ada satu perbedaan penting antara

>>> round(1.5)
2
08 dan
>>> round(1.5)
2
74 dan
>>> def truncate(n):
..     return int(n * 1000) / 1000
03 yang menyoroti aspek penting pembulatan. simetri sekitar nol

Ingatlah bahwa

>>> round(1.5)
2
_74 tidak simetris di sekitar nol. Dalam istilah matematika, fungsi f(x) simetris di sekitar nol jika, untuk nilai x berapa pun, f(x) + f(-x) = 0. Misalnya,
>>> def truncate(n):
..     return int(n * 1000) / 1000
17 mengembalikan
>>> round(1.5)
2
01, tetapi
>>> round(1.5)
2
87 mengembalikan
>>> round(1.5)
2
70. Fungsi
>>> def truncate(n):
..     return int(n * 1000) / 1000
_03 juga tidak simetris di sekitar 0

Di sisi lain, fungsi

>>> round(1.5)
2
_08 simetris di sekitar nol. Ini karena, setelah menggeser titik desimal ke kanan,
>>> round(1.5)
2
08 memotong digit yang tersisa. Ketika nilai awal positif, ini sama dengan membulatkan angka ke bawah. Bilangan negatif dibulatkan ke atas. Jadi,
>>> def truncate(n):
..     return int(n * 1000) / 1000
_24 mengembalikan
>>> round(1.5)
2
59, dan
>>> def truncate(n):
..     return int(n * 1000) / 1000
26 mengembalikan
>>> round(1.5)
2
70

Konsep simetri memperkenalkan gagasan bias pembulatan, yang menjelaskan bagaimana pembulatan memengaruhi data numerik dalam kumpulan data

Strategi “pembulatan” memiliki bias bulat menuju tak terhingga positif, karena nilainya selalu dibulatkan ke atas searah tak terhingga positif. Demikian pula, strategi "pembulatan ke bawah" memiliki putaran menuju bias infinity negatif

Strategi "pemotongan" menunjukkan bias putaran menuju tak terhingga negatif pada nilai positif dan putaran menuju tak terhingga positif untuk nilai negatif. Fungsi pembulatan dengan perilaku ini dikatakan memiliki bias putaran menuju nol, secara umum

Mari kita lihat bagaimana ini bekerja dalam praktiknya. Perhatikan daftar pelampung berikut

>>>

>>> round(1.5)
2
7

Mari hitung nilai rata-rata dari nilai-nilai di

>>> def truncate(n):
..     return int(n * 1000) / 1000
28 menggunakan fungsi

>>> ________30______8

Sekarang terapkan masing-masing

>>> round(1.5)
2
74,
>>> def truncate(n):
..     return int(n * 1000) / 1000
03, dan
>>> round(1.5)
2
08 dalam pemahaman daftar untuk membulatkan setiap angka di
>>> def truncate(n):
..     return int(n * 1000) / 1000
28 ke satu tempat desimal dan menghitung rata-rata baru

>>>

>>> round(1.5)
2
9

Setelah setiap angka di

>>> def truncate(n):
..     return int(n * 1000) / 1000
28 dibulatkan, rata-rata yang baru adalah sekitar
>>> def truncate(n):
..     return int(n * 1000) / 1000
35, yang lebih besar dari rata-rata sebenarnya sekitar
>>> def truncate(n):
..     return int(n * 1000) / 1000
36. Pembulatan ke bawah akan menggeser rata-rata ke bawah menjadi sekitar
>>> def truncate(n):
..     return int(n * 1000) / 1000
37. Rata-rata dari nilai terpotong adalah sekitar
>>> def truncate(n):
..     return int(n * 1000) / 1000
38 dan paling dekat dengan rata-rata sebenarnya

Contoh ini tidak menyiratkan bahwa Anda harus selalu memotong saat Anda perlu membulatkan nilai individual sambil mempertahankan nilai rata-rata sedekat mungkin. Daftar

>>> def truncate(n):
..     return int(n * 1000) / 1000
_28 berisi jumlah nilai positif dan negatif yang sama. Fungsi
>>> round(1.5)
2
_08 akan berperilaku seperti
>>> round(1.5)
2
74 pada daftar semua nilai positif, dan seperti
>>> def truncate(n):
..     return int(n * 1000) / 1000
03 pada daftar semua nilai negatif

Apa yang diilustrasikan oleh contoh ini adalah pengaruh bias pembulatan terhadap nilai yang dihitung dari data yang telah dibulatkan. Anda perlu mengingat efek ini saat menarik kesimpulan dari data yang telah dibulatkan

Biasanya, saat membulatkan, Anda tertarik untuk membulatkan ke angka terdekat dengan presisi tertentu, bukan hanya membulatkan semuanya ke atas atau ke bawah

Misalnya, jika seseorang meminta Anda untuk membulatkan angka

>>> def truncate(n):
..     return int(n * 1000) / 1000
43 dan
>>> def truncate(n):
..     return int(n * 1000) / 1000
44 ke satu tempat desimal, Anda mungkin akan menjawab dengan cepat dengan
>>> round(1.5)
2
58 dan
>>> def truncate(n):
..     return int(n * 1000) / 1000
46. Fungsi
>>> round(1.5)
2
_08,
>>> round(1.5)
2
74, dan
>>> def truncate(n):
..     return int(n * 1000) / 1000
03 tidak melakukan hal seperti ini

Bagaimana dengan nomor

>>> def truncate(n):
..     return int(n * 1000) / 1000
_50? . Dalam arti tertentu,
>>> round(1.5)
2
58 dan
>>> def truncate(n):
..     return int(n * 1000) / 1000
46 keduanya adalah angka terdekat ke
>>> def truncate(n):
..     return int(n * 1000) / 1000
50 dengan presisi tempat desimal tunggal. Nomor
>>> def truncate(n):
..     return int(n * 1000) / 1000
50 disebut seri sehubungan dengan
>>> round(1.5)
2
58 dan
>>> def truncate(n):
..     return int(n * 1000) / 1000
46. Dalam kasus seperti ini, Anda harus menetapkan tiebreak

Cara kebanyakan orang diajari memutuskan ikatan adalah dengan membulatkan ke angka yang lebih besar dari dua kemungkinan

Hilangkan iklan

Membulatkan Setengah Ke Atas

Strategi “pembulatan setengah ke atas” membulatkan setiap angka ke angka terdekat dengan presisi yang ditentukan, dan memutuskan hubungan dengan pembulatan ke atas. Berikut beberapa contohnya

NilaiBulatkan Separuh Ke Atas Hasil13. 825 tempat puluhan1013. 825 Tempat Satu1413. 825 Tempat persepuluhan13. 813. 825 Tempat keseratus13. 83

Untuk menerapkan strategi "pembulatan setengah" dengan Python, Anda mulai seperti biasa dengan menggeser koma desimal ke kanan dengan jumlah tempat yang diinginkan. Namun, pada titik ini, Anda memerlukan cara untuk menentukan apakah angka tepat setelah titik desimal yang digeser lebih kecil atau lebih besar dari atau sama dengan

>>> def truncate(n):
..     return int(n * 1000) / 1000
61

Salah satu cara melakukannya adalah dengan menambahkan

>>> def truncate(n):
..     return int(n * 1000) / 1000
_62 ke nilai yang digeser lalu dibulatkan ke bawah dengan
>>> def truncate(n):
..     return int(n * 1000) / 1000
06. Ini bekerja karena

  • Jika digit di tempat desimal pertama dari nilai yang digeser kurang dari lima, maka penambahan

    >>> def truncate(n):
    ..     return int(n * 1000) / 1000
    
    62 tidak akan mengubah bagian bilangan bulat dari nilai yang digeser, jadi batas bawahnya sama dengan bagian bilangan bulat

  • Jika digit pertama setelah tempat desimal lebih besar dari atau sama dengan

    >>> def truncate(n):
    ..     return int(n * 1000) / 1000
    
    61, maka penambahan
    >>> def truncate(n):
    ..     return int(n * 1000) / 1000
    
    62 akan menambah bagian bilangan bulat dari nilai yang digeser sebesar
    >>> round(1.5)
    2
    
    59, jadi batas bawahnya sama dengan bilangan bulat yang lebih besar ini

Inilah tampilannya di Python

>>> def truncate(n):
..     return int(n * 1000) / 1000
_0

Perhatikan bahwa

>>> def truncate(n):
..     return int(n * 1000) / 1000
_68 sangat mirip dengan
>>> def truncate(n):
..     return int(n * 1000) / 1000
03. Ini mungkin agak kontra-intuitif, tetapi secara internal
>>> def truncate(n):
..     return int(n * 1000) / 1000
68 hanya dibulatkan ke bawah. Caranya adalah dengan menjumlahkan
>>> def truncate(n):
..     return int(n * 1000) / 1000
_62 setelah menggeser titik desimal agar hasil pembulatan ke bawah sesuai dengan nilai yang diharapkan

Mari kita uji

>>> def truncate(n):
..     return int(n * 1000) / 1000
_68 pada beberapa nilai untuk melihat apakah itu berhasil

>>>

>>> def truncate(n):
..     return int(n * 1000) / 1000
1

Karena

>>> def truncate(n):
..     return int(n * 1000) / 1000
_68 selalu memutuskan ikatan dengan pembulatan ke yang lebih besar dari dua nilai yang mungkin, nilai negatif seperti
>>> round(1.5)
2
95 dibulatkan ke
>>> round(1.5)
2
70, bukan ke
>>> round(1.5)
2
96

>>>

>>> def truncate(n):
..     return int(n * 1000) / 1000
2

Besar. Anda sekarang akhirnya bisa mendapatkan hasil bahwa fungsi

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
9 built-in ditolak untuk Anda

>>>

>>> def truncate(n):
..     return int(n * 1000) / 1000
3

Namun, sebelum Anda terlalu bersemangat, mari kita lihat apa yang terjadi jika Anda mencoba membulatkan

>>> def truncate(n):
..     return int(n * 1000) / 1000
78 ke
>>> round(1.5)
2
01 tempat desimal

>>>

>>> def truncate(n):
..     return int(n * 1000) / 1000
4

Tunggu. Kami baru saja membahas bagaimana ikatan dibulatkan ke yang lebih besar dari dua nilai yang mungkin.

>>> def truncate(n):
..     return int(n * 1000) / 1000
_78 terletak di tengah-tengah
>>> def truncate(n):
..     return int(n * 1000) / 1000
81 dan
>>> def truncate(n):
..     return int(n * 1000) / 1000
82. Karena
>>> def truncate(n):
..     return int(n * 1000) / 1000
_81 lebih besar dari keduanya,
>>> def truncate(n):
..     return int(n * 1000) / 1000
84 harus mengembalikan
>>> def truncate(n):
..     return int(n * 1000) / 1000
81. Namun sebaliknya, kami mendapatkan
>>> def truncate(n):
..     return int(n * 1000) / 1000
_82

Apakah ada bug di fungsi

>>> def truncate(n):
..     return int(n * 1000) / 1000
_68?

Ketika

>>> def truncate(n):
..     return int(n * 1000) / 1000
_68 membulatkan
>>> def truncate(n):
..     return int(n * 1000) / 1000
78 menjadi dua tempat desimal, hal pertama yang dilakukannya adalah mengalikan
>>> def truncate(n):
..     return int(n * 1000) / 1000
78 dengan
>>> round(1.5)
2
16. Mari pastikan ini berfungsi seperti yang diharapkan

>>>

>>> def truncate(n):
..     return int(n * 1000) / 1000
5

Yah… itu salah. Tapi itu menjelaskan mengapa

>>> def truncate(n):
..     return int(n * 1000) / 1000
_84 mengembalikan -1. 23. Mari kita lanjutkan algoritma
>>> def truncate(n):
..     return int(n * 1000) / 1000
_68 selangkah demi selangkah, memanfaatkan
>>> round(1.5)
2
28 di REPL untuk mengingat output nilai terakhir di setiap langkah

>>>

>>> def truncate(n):
..     return int(n * 1000) / 1000
6

Meskipun

>>> def truncate(n):
..     return int(n * 1000) / 1000
_95 sangat dekat dengan
>>> def truncate(n):
..     return int(n * 1000) / 1000
96, bilangan bulat terdekat yang kurang dari atau sama dengan itu adalah
>>> def truncate(n):
..     return int(n * 1000) / 1000
97. Ketika titik desimal digeser kembali ke kiri, nilai akhirnya adalah
>>> def truncate(n):
..     return int(n * 1000) / 1000
82

Nah, sekarang Anda tahu bagaimana

>>> def truncate(n):
..     return int(n * 1000) / 1000
_84 mengembalikan
>>> def truncate(n):
..     return int(n * 1000) / 1000
82 meskipun tidak ada kesalahan logis, tetapi mengapa Python mengatakan bahwa
>>> actual_value, truncated_value = 100, 100
01 adalah
>>> actual_value, truncated_value = 100, 100
02?

Ke samping. Dalam sesi juru bahasa Python, ketikkan yang berikut ini

>>> ________41______7

Melihat ini untuk pertama kalinya bisa sangat mengejutkan, tetapi ini adalah contoh klasik dari kesalahan representasi titik-mengambang. Itu tidak ada hubungannya dengan Python. Kesalahan tersebut berkaitan dengan cara mesin menyimpan angka titik-mengambang di memori

Sebagian besar komputer modern menyimpan angka floating-point sebagai desimal biner dengan presisi 53-bit. Hanya angka yang memiliki representasi desimal biner terbatas yang dapat dinyatakan dalam 53 bit yang disimpan sebagai nilai eksak. Tidak setiap angka memiliki representasi desimal biner yang terbatas

Misalnya, angka desimal

>>> actual_value, truncated_value = 100, 100
03 memiliki representasi desimal yang terbatas, tetapi representasi biner yang tidak terbatas. Sama seperti pecahan 1/3 hanya dapat direpresentasikan dalam desimal sebagai desimal berulang tak terhingga
>>> actual_value, truncated_value = 100, 100
04, pecahan
>>> actual_value, truncated_value = 100, 100
05 hanya dapat dinyatakan dalam biner sebagai desimal berulang tak terhingga
>>> actual_value, truncated_value = 100, 100
06

Nilai dengan representasi biner tak terbatas dibulatkan ke nilai perkiraan untuk disimpan dalam memori. Metode yang digunakan sebagian besar mesin untuk membulatkan ditentukan menurut standar IEEE-754, yang menentukan pembulatan ke pecahan biner terdekat yang dapat diwakili

Dokumen Python memiliki bagian yang disebut Floating Point Arithmetic. Masalah dan Keterbatasan yang mengatakan tentang angka 0. 1

Pada sebagian besar mesin, jika Python mencetak nilai desimal sebenarnya dari perkiraan biner yang disimpan untuk

>>> actual_value, truncated_value = 100, 100
_03, itu harus ditampilkan

>>> ________41______8

Itu lebih banyak digit daripada yang dianggap berguna oleh kebanyakan orang, jadi Python menjaga jumlah digit dapat dikelola dengan menampilkan nilai bulat sebagai gantinya

>>>

>>> def truncate(n):
..     return int(n * 1000) / 1000
9

Ingat saja, meskipun hasil cetak terlihat seperti nilai persis

>>> actual_value, truncated_value = 100, 100
05, nilai sebenarnya yang disimpan adalah pecahan biner terdekat yang dapat diwakili. (Sumber)

Untuk risalah yang lebih mendalam tentang aritmatika titik-mengambang, lihat artikel David Goldberg Yang Harus Diketahui Setiap Ilmuwan Komputer Tentang Aritmatika Titik-Mengambang, aslinya diterbitkan dalam jurnal ACM Computing Surveys, Vol. 23, Tidak. 1 Maret 1991

Fakta bahwa Python mengatakan bahwa

>>> actual_value, truncated_value = 100, 100
_01 adalah
>>> actual_value, truncated_value = 100, 100
02 adalah artefak kesalahan representasi titik-mengambang. Anda mungkin bertanya pada diri sendiri, "Oke, tetapi apakah ada cara untuk memperbaikinya?"

Angka floating-point tidak memiliki presisi yang tepat, dan karenanya tidak boleh digunakan dalam situasi di mana presisi adalah yang terpenting. Untuk aplikasi di mana presisi yang tepat diperlukan, Anda dapat menggunakan kelas

>>> actual_value, truncated_value = 100, 100
11 dari modul
>>> actual_value, truncated_value = 100, 100
12 Python. Anda akan mempelajari lebih lanjut tentang kelas
>>> actual_value, truncated_value = 100, 100
_11 di bawah ini

Jika Anda telah menentukan bahwa kelas

>>> actual_value, truncated_value = 100, 100
14 standar Python sudah cukup untuk aplikasi Anda, beberapa kesalahan sesekali di
>>> def truncate(n):
..     return int(n * 1000) / 1000
68 karena kesalahan representasi titik-mengambang seharusnya tidak menjadi perhatian

Sekarang setelah Anda merasakan bagaimana mesin membulatkan angka dalam memori, mari lanjutkan diskusi kita tentang strategi pembulatan dengan melihat cara lain untuk memutuskan seri

Hilangkan iklan

Membulatkan Setengah Ke Bawah

Strategi "membulatkan setengah ke bawah" membulatkan ke angka terdekat dengan presisi yang diinginkan, seperti metode "membulatkan setengah ke atas", kecuali strategi ini memutus ikatan dengan membulatkan ke angka yang lebih kecil dari dua angka. Berikut beberapa contohnya

NilaiBulatkan Setengah Ke Bawah Ke Hasil13. 825 tempat puluhan1013. 825 Tempat Satu1413. 825 Tempat persepuluhan13. 813. 825 Tempat keseratus13. 82

Anda dapat menerapkan strategi "pembulatan setengah ke bawah" dengan Python dengan mengganti

>>> def truncate(n):
..     return int(n * 1000) / 1000
06 di fungsi
>>> def truncate(n):
..     return int(n * 1000) / 1000
68 dengan
>>> round(1.5)
2
67 dan mengurangi
>>> def truncate(n):
..     return int(n * 1000) / 1000
62 alih-alih menambahkan

>>> actual_value, truncated_value = 100, 100
0

Mari kita periksa

>>> actual_value, truncated_value = 100, 100
_20 terhadap beberapa kasus uji

>>>

>>> actual_value, truncated_value = 100, 100
1

Baik

>>> def truncate(n):
..     return int(n * 1000) / 1000
_68 dan
>>> actual_value, truncated_value = 100, 100
20 tidak memiliki bias secara umum. Namun, membulatkan data dengan banyak ikatan memang menimbulkan bias. Sebagai contoh ekstrem, perhatikan daftar angka berikut

>>>

>>> actual_value, truncated_value = 100, 100
2

Mari kita hitung rata-rata dari angka-angka ini

>>>

>>> actual_value, truncated_value = 100, 100
3

Selanjutnya, hitung rata-rata data setelah dibulatkan ke satu tempat desimal dengan ________41______68 dan

>>> actual_value, truncated_value = 100, 100
20

>>>

>>> actual_value, truncated_value = 100, 100
4

Setiap angka di

>>> def truncate(n):
..     return int(n * 1000) / 1000
28 adalah seri sehubungan dengan pembulatan ke satu tempat desimal. Fungsi
>>> def truncate(n):
..     return int(n * 1000) / 1000
_68 memperkenalkan putaran menuju bias tak terhingga positif, dan
>>> actual_value, truncated_value = 100, 100
20 memperkenalkan putaran menuju bias tak terhingga negatif

Strategi pembulatan yang tersisa akan kami diskusikan semua upaya untuk mengurangi bias ini dengan cara yang berbeda

Membulatkan Setengah Jauh Dari Nol

Jika Anda memeriksa

>>> def truncate(n):
..     return int(n * 1000) / 1000
68 dan
>>> actual_value, truncated_value = 100, 100
20 dengan cermat, Anda akan melihat bahwa tidak satu pun dari fungsi ini yang simetris di sekitar nol

>>>

>>> actual_value, truncated_value = 100, 100
5

Salah satu cara untuk memperkenalkan simetri adalah dengan selalu membulatkan dasi dari nol. Tabel berikut mengilustrasikan cara kerjanya

NilaiBulatkan Separuh Dari Nol Ke Hasil15. 25 Tempat Puluhan2015. 25 Tempat Satu1515. 25 Tempat persepuluhan15. 3-15. 25 tempat Puluhan-20-15. 25Satuan tempat-15-15. 25 Tempat persepuluhan-15. 3

Untuk menerapkan strategi “membulatkan setengah dari nol” pada angka

>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
1, Anda mulai seperti biasa dengan menggeser titik desimal ke kanan sejumlah tempat tertentu. Kemudian Anda melihat digit
>>> truncate(125.6, -1)
120.0

>>> truncate(-1374.25, -3)
-1000.0
4 tepat di sebelah kanan tempat desimal di nomor baru ini. Pada titik ini, ada empat kasus yang perlu dipertimbangkan

  1. Jika
    >>> truncate(12.5)
    12.0
    
    >>> truncate(-5.963, 1)
    -5.9
    
    >>> truncate(1.625, 2)
    1.62
    
    1 positif dan
    >>> actual_value, truncated_value = 100, 100
    
    33, bulatkan ke atas
  2. Jika
    >>> truncate(12.5)
    12.0
    
    >>> truncate(-5.963, 1)
    -5.9
    
    >>> truncate(1.625, 2)
    1.62
    
    1 positif dan
    >>> actual_value, truncated_value = 100, 100
    
    35, bulatkan ke bawah
  3. Jika
    >>> truncate(12.5)
    12.0
    
    >>> truncate(-5.963, 1)
    -5.9
    
    >>> truncate(1.625, 2)
    1.62
    
    1 negatif dan
    >>> actual_value, truncated_value = 100, 100
    
    33, bulatkan ke bawah
  4. Jika
    >>> truncate(12.5)
    12.0
    
    >>> truncate(-5.963, 1)
    -5.9
    
    >>> truncate(1.625, 2)
    1.62
    
    1 negatif dan
    >>> actual_value, truncated_value = 100, 100
    
    35, bulatkan ke atas

Setelah membulatkan menurut salah satu dari empat aturan di atas, Anda kemudian menggeser tempat desimal kembali ke kiri

Diberi nomor

>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
1 dan nilai untuk
>>> round(1.5)
2
54, Anda dapat mengimplementasikannya di Python dengan menggunakan
>>> def truncate(n):
..     return int(n * 1000) / 1000
68 dan
>>> actual_value, truncated_value = 100, 100
20

>>> actual_value, truncated_value = 100, 100
6

Itu cukup mudah, tetapi sebenarnya ada cara yang lebih sederhana

Jika Anda pertama kali mengambil nilai absolut

>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
_1 menggunakan fungsi bawaan Python, Anda bisa menggunakan
>>> def truncate(n):
..     return int(n * 1000) / 1000
68 untuk membulatkan angka. Maka yang perlu Anda lakukan adalah memberikan tanda yang sama pada angka yang dibulatkan dengan
>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
1. Salah satu cara untuk melakukannya adalah dengan menggunakan fungsi

>>> actual_value, truncated_value = 100, 100
48 mengambil dua angka
>>> actual_value, truncated_value = 100, 100
50 dan
>>> actual_value, truncated_value = 100, 100
51 dan mengembalikan
>>> actual_value, truncated_value = 100, 100
50 dengan tanda
>>> actual_value, truncated_value = 100, 100
51

>>> ________50______7

Perhatikan bahwa

>>> actual_value, truncated_value = 100, 100
_48 mengembalikan
>>> actual_value, truncated_value = 100, 100
14, meskipun kedua argumennya bilangan bulat

Menggunakan

>>> actual_value, truncated_value = 100, 100
_45,
>>> def truncate(n):
..     return int(n * 1000) / 1000
68 dan
>>> actual_value, truncated_value = 100, 100
48, Anda dapat menerapkan strategi "pembulatan setengah dari nol" hanya dalam dua baris Python

>>> actual_value, truncated_value = 100, 100
8

Di

>>> actual_value, truncated_value = 100, 100
_59, nilai absolut dari
>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
1 dibulatkan menjadi
>>> round(1.5)
2
54 tempat desimal menggunakan
>>> def truncate(n):
..     return int(n * 1000) / 1000
68 dan hasil ini diberikan ke variabel
>>> actual_value, truncated_value = 100, 100
63. Kemudian tanda asli dari
>>> truncate(12.5)
12.0

>>> truncate(-5.963, 1)
-5.9

>>> truncate(1.625, 2)
1.62
1 diterapkan ke
>>> actual_value, truncated_value = 100, 100
63 menggunakan
>>> actual_value, truncated_value = 100, 100
48, dan nilai akhir ini dengan tanda yang benar dikembalikan oleh fungsi

Memeriksa

>>> actual_value, truncated_value = 100, 100
_59 pada beberapa nilai yang berbeda menunjukkan bahwa fungsi berperilaku seperti yang diharapkan

>>>

>>> actual_value, truncated_value = 100, 100
9

Fungsi

>>> actual_value, truncated_value = 100, 100
_59 membulatkan angka seperti kebanyakan orang cenderung membulatkan angka dalam kehidupan sehari-hari. Selain menjadi fungsi pembulatan paling umum yang pernah Anda lihat sejauh ini,
>>> actual_value, truncated_value = 100, 100
59 juga menghilangkan bias pembulatan dengan baik dalam kumpulan data yang memiliki jumlah ikatan positif dan negatif yang sama

Mari kita periksa seberapa baik

>>> actual_value, truncated_value = 100, 100
_59 mengurangi bias pembulatan pada contoh dari bagian sebelumnya

>>>

>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
0

Nilai rata-rata angka di

>>> def truncate(n):
..     return int(n * 1000) / 1000
_28 dipertahankan hampir persis saat Anda membulatkan setiap angka di
>>> def truncate(n):
..     return int(n * 1000) / 1000
28 ke satu tempat desimal dengan
>>> actual_value, truncated_value = 100, 100
59

Namun,

>>> actual_value, truncated_value = 100, 100
_59 akan menunjukkan bias pembulatan saat Anda membulatkan setiap angka dalam kumpulan data dengan hanya ikatan positif, hanya ikatan negatif, atau lebih banyak ikatan dari satu tanda daripada yang lain. Bias hanya dimitigasi dengan baik jika ada jumlah ikatan positif dan negatif yang sama dalam kumpulan data

Bagaimana Anda menangani situasi di mana jumlah ikatan positif dan negatif sangat berbeda? . Fungsi bawaan Python

Hilangkan iklan

Pembulatan Setengah Hingga Genap

Salah satu cara untuk mengurangi bias pembulatan saat membulatkan nilai dalam kumpulan data adalah dengan membulatkan ikatan ke bilangan genap terdekat pada presisi yang diinginkan. Berikut beberapa contoh cara melakukannya

NilaiPutaran Separuh Hingga Genap Hingga Hasil15. 255Tempat Puluhan2015. 255 Tempat seseorang1515. 255 Tempat persepuluhan15. 315. 255 Tempat keseratus15. 26

The "rounding half to even strategy" adalah strategi yang digunakan oleh fungsi

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
9 bawaan Python dan merupakan. Strategi ini bekerja berdasarkan asumsi bahwa probabilitas seri dalam kumpulan data yang dibulatkan ke bawah atau ke atas adalah sama. Dalam praktiknya, ini biasanya terjadi

Sekarang Anda tahu mengapa

>>> round(1.5)
2
04 mengembalikan
>>> round(1.5)
2
01. Itu bukan kesalahan. Ini adalah keputusan desain sadar berdasarkan rekomendasi yang solid

Untuk membuktikan kepada diri sendiri bahwa

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
_9 benar-benar membulatkan ke genap, cobalah pada beberapa nilai yang berbeda

>>>

>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
1

Fungsi

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
9 hampir bebas dari bias, tetapi tidak sempurna. Misalnya, bias pembulatan masih dapat terjadi jika sebagian besar ikatan dalam kumpulan data Anda dibulatkan ke atas, bukan dibulatkan ke bawah. Strategi yang mengurangi bias bahkan lebih baik daripada “membulatkan setengah ke genap”, tetapi agak tidak jelas dan hanya diperlukan dalam keadaan ekstrim

Akhirnya,

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
_9 menderita cegukan yang sama seperti yang Anda lihat di
>>> def truncate(n):
..     return int(n * 1000) / 1000
68 berkat kesalahan representasi titik-mengambang

>>>

>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
2

Anda tidak perlu khawatir dengan kesalahan sesekali ini jika presisi floating-point sudah cukup untuk aplikasi Anda

Ketika presisi adalah yang terpenting, Anda harus menggunakan kelas

>>> actual_value, truncated_value = 100, 100
11 Python

Kelas >>> actual_value, truncated_value = 100, 100 _11

Modul desimal Python adalah salah satu fitur "termasuk baterai" dari bahasa yang mungkin tidak Anda sadari jika Anda baru mengenal Python. Prinsip panduan modul

>>> actual_value, truncated_value = 100, 100
_12 dapat ditemukan di dokumentasi

Desimal “didasarkan pada model floating-point yang dirancang dengan mempertimbangkan manusia, dan tentu saja memiliki prinsip panduan terpenting – komputer harus menyediakan aritmatika yang bekerja dengan cara yang sama seperti aritmatika yang dipelajari orang di sekolah. ” – kutipan dari spesifikasi aritmatika desimal. (Sumber)

Manfaat modul

>>> actual_value, truncated_value = 100, 100
_12 meliputi

  • Representasi desimal yang tepat.
    >>> actual_value, truncated_value = 100, 100
    
    03 sebenarnya
    >>> actual_value, truncated_value = 100, 100
    
    03, dan
    >>> actual_value, truncated_value = 100, 100
    
    89 mengembalikan
    >>> round(1.5)
    2
    
    25, seperti yang Anda harapkan
  • Pelestarian digit signifikan. Ketika Anda menambahkan
    >>> actual_value, truncated_value = 100, 100
    
    91 dan
    >>> actual_value, truncated_value = 100, 100
    
    92, hasilnya adalah
    >>> actual_value, truncated_value = 100, 100
    
    93 dengan nol di belakang dipertahankan untuk menunjukkan signifikansi
  • Presisi yang dapat diubah pengguna. Presisi default modul
    >>> actual_value, truncated_value = 100, 100
    
    _12 adalah dua puluh delapan digit, tetapi nilai ini dapat diubah oleh pengguna agar sesuai dengan masalah yang dihadapi

Mari jelajahi cara kerja pembulatan dalam modul

>>> actual_value, truncated_value = 100, 100
12. Mulailah dengan mengetik yang berikut ke dalam Python REPL

>>>

>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
3

>>> actual_value, truncated_value = 100, 100
96 mengembalikan objek
>>> actual_value, truncated_value = 100, 100
97 yang mewakili konteks default modul
>>> actual_value, truncated_value = 100, 100
12. Konteksnya mencakup presisi default dan strategi pembulatan default, antara lain

Seperti yang Anda lihat pada contoh di atas, strategi pembulatan default untuk modul

>>> actual_value, truncated_value = 100, 100
12 adalah
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
00. Ini sejalan dengan fungsi
def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
9 bawaan dan harus menjadi strategi pembulatan yang lebih disukai untuk sebagian besar tujuan

Mari mendeklarasikan angka menggunakan kelas

>>> actual_value, truncated_value = 100, 100
_12 modul
>>> actual_value, truncated_value = 100, 100
11. Untuk melakukannya, buat instance
>>> actual_value, truncated_value = 100, 100
_11 baru dengan meneruskan
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
05 yang berisi nilai yang diinginkan

>>>

>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
4

Catatan. Dimungkinkan untuk membuat instance

>>> actual_value, truncated_value = 100, 100
_11 dari angka floating-point, tetapi hal itu menyebabkan kesalahan representasi floating-point langsung dari kelelawar. Misalnya, lihat apa yang terjadi saat Anda membuat instance
>>> actual_value, truncated_value = 100, 100
11 dari angka floating-point
>>> actual_value, truncated_value = 100, 100
03

>>>

>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
5

Untuk mempertahankan presisi yang tepat, Anda harus membuat

>>> actual_value, truncated_value = 100, 100
11 contoh dari string yang berisi angka desimal yang Anda butuhkan

Hanya untuk bersenang-senang, mari kita uji pernyataan bahwa

>>> actual_value, truncated_value = 100, 100
11 mempertahankan representasi desimal yang tepat

>>>

>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
6

Ahhh. Itu memuaskan, bukan?

Membulatkan

>>> actual_value, truncated_value = 100, 100
_11 dilakukan dengan metode
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
12

>>>

>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
7

Oke, itu mungkin terlihat sedikit funky, jadi mari kita uraikan. Argumen

>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
_13 di
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
12 menentukan jumlah tempat desimal untuk membulatkan angka. Karena
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
_15 memiliki satu tempat desimal, angka
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
16 dibulatkan menjadi satu tempat desimal. Strategi pembulatan default adalah “membulatkan setengah ke genap”, sehingga hasilnya adalah
>>> import math

>>> math.ceil(1.2)
2

>>> math.ceil(2)
2

>>> math.ceil(-0.5)
0
4

Ingatlah bahwa fungsi

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
_9, yang juga menggunakan strategi "pembulatan setengah ke genap", gagal membulatkan
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
19 menjadi dua tempat desimal dengan benar. Alih-alih
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
20,
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
21 mengembalikan
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
22. Berkat
>>> actual_value, truncated_value = 100, 100
_12 modul representasi desimal yang tepat, Anda tidak akan mengalami masalah ini dengan kelas
>>> actual_value, truncated_value = 100, 100
11

>>> ________57______8

Manfaat lain dari modul

>>> actual_value, truncated_value = 100, 100
12 adalah pembulatan setelah melakukan aritmatika dilakukan secara otomatis, dan angka signifikan dipertahankan. Untuk melihat ini dalam tindakan, mari ubah presisi default dari dua puluh delapan digit menjadi dua, lalu tambahkan angka
>>> def truncate(n):
..     return int(n * 1000) / 1000
43 dan
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
27

>>>

>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
9

Untuk mengubah presisi, Anda memanggil

>>> actual_value, truncated_value = 100, 100
_96 dan menyetel atribut
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
29. Jika menyetel atribut pada panggilan fungsi terlihat aneh bagi Anda, Anda dapat melakukan ini karena
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
30 mengembalikan objek
>>> actual_value, truncated_value = 100, 100
97 khusus yang mewakili konteks internal saat ini yang berisi parameter default yang digunakan oleh modul
>>> actual_value, truncated_value = 100, 100
12

Nilai pasti dari

>>> def truncate(n):
..     return int(n * 1000) / 1000
43 ditambah
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
27 adalah
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
35. Karena ketepatannya sekarang adalah dua digit, dan strategi pembulatan diatur ke default "pembulatan setengah ke genap", nilai
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
35 secara otomatis dibulatkan menjadi
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
37

Untuk mengubah strategi pembulatan default, Anda dapat menyetel properti

>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
38 ke salah satu dari beberapa. Tabel berikut meringkas tanda-tanda ini dan strategi pembulatan mana yang diterapkan

Tandai Strategi Pembulatan

>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
39Membulatkan ke atas
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
40Membulatkan ke bawah________57______41Pemangkasan
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
42Membulatkan dari nol
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
43Membulatkan setengah dari nol
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
44Membulatkan setengah menuju nol________57______45Membulatkan_5657_____membulatkan ke nol______45

Hal pertama yang perlu diperhatikan adalah bahwa skema penamaan yang digunakan oleh modul

>>> actual_value, truncated_value = 100, 100
12 berbeda dari apa yang telah kita sepakati sebelumnya di artikel. Misalnya,
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
42 menerapkan strategi "pembulatan jauh dari nol", yang sebenarnya membulatkan angka negatif ke bawah

Kedua, beberapa strategi pembulatan yang disebutkan dalam tabel mungkin terlihat asing karena kita belum membahasnya. Anda telah melihat cara kerja

>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
_45, jadi mari kita lihat masing-masing cara kerjanya

Strategi

>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
_39 bekerja seperti fungsi
>>> round(1.5)
2
74 yang kita definisikan sebelumnya

>>>

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
0

Perhatikan bahwa hasil dari

>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
_39 tidak simetris di sekitar nol

Strategi

>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
_40 bekerja seperti fungsi
>>> def truncate(n):
..     return int(n * 1000) / 1000
03 kita

>>>

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
1

Seperti

>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
_39, strategi ________57______40 tidak simetris di sekitar nol

Strategi

>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
_41 dan
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
42 memiliki nama yang agak menipu. Baik
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
_59 dan
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
60 simetris di sekitar nol

>>>

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
2

Strategi

>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
_41 membulatkan angka menuju nol, seperti fungsi
>>> round(1.5)
2
08. Di sisi lain,
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
_42 membulatkan semuanya dari nol. Ini adalah jeda yang jelas dari terminologi yang kami sepakati sebelumnya dalam artikel ini, jadi ingatlah itu saat Anda bekerja dengan modul
>>> actual_value, truncated_value = 100, 100
12

Ada tiga strategi dalam modul

>>> actual_value, truncated_value = 100, 100
_12 yang memungkinkan pembulatan yang lebih bernuansa. Metode
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
_43 membulatkan semuanya ke angka terdekat dan memutus ikatan dengan membulatkan dari nol

>>>

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
3

Perhatikan bahwa

>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
43 berfungsi seperti
>>> actual_value, truncated_value = 100, 100
59 kita dan tidak seperti
>>> def truncate(n):
..     return int(n * 1000) / 1000
68

Ada juga strategi

>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
_44 yang memutuskan ikatan dengan pembulatan ke nol

>>>

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
4

Strategi pembulatan terakhir yang tersedia dalam modul

>>> actual_value, truncated_value = 100, 100
12 sangat berbeda dari apa pun yang telah kita lihat sejauh ini

>>>

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
5

Dalam contoh di atas, sepertinya ________57______46 membulatkan semuanya menuju nol. Faktanya, inilah cara kerja

>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
_46, kecuali jika hasil pembulatan berakhir dengan
>>> round(1.5)
2
25 atau
>>> def truncate(n):
..     return int(n * 1000) / 1000
61. Dalam hal ini, angka dibulatkan dari nol

>>>

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
6

Pada contoh pertama, angka

>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
_76 pertama dibulatkan ke arah nol di tempat desimal kedua, menghasilkan
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
77. Karena
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
_77 tidak diakhiri dengan
>>> round(1.5)
2
25 atau
>>> def truncate(n):
..     return int(n * 1000) / 1000
61, maka dibiarkan apa adanya. Di sisi lain,
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
_81 dibulatkan ke nol di tempat desimal kedua, menghasilkan angka
>>> import math

>>> math.ceil(1.2)
2

>>> math.ceil(2)
2

>>> math.ceil(-0.5)
0
8. Ini diakhiri dengan
>>> def truncate(n):
..     return int(n * 1000) / 1000
_61, jadi tempat desimal pertama kemudian dibulatkan dari nol menjadi
>>> import math

>>> math.ceil(1.2)
2

>>> math.ceil(2)
2

>>> math.ceil(-0.5)
0
4

Pada bagian ini, kita hanya berfokus pada aspek pembulatan modul

>>> actual_value, truncated_value = 100, 100
12. Ada sejumlah besar fitur lain yang membuat
>>> actual_value, truncated_value = 100, 100
12 pilihan yang sangat baik untuk aplikasi di mana presisi floating-point standar tidak memadai, seperti perbankan dan beberapa masalah dalam komputasi ilmiah

Untuk informasi lebih lanjut tentang

>>> actual_value, truncated_value = 100, 100
_11, lihat di dalam dokumen Python

Selanjutnya, mari kita alihkan perhatian kita ke dua pokok tumpukan komputasi ilmiah dan ilmu data Python. NumPy dan Panda

Hilangkan iklan

Membulatkan Array NumPy

Dalam domain ilmu data dan komputasi ilmiah, Anda sering menyimpan data Anda sebagai NumPy

>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
88. Salah satu fitur NumPy yang paling kuat adalah penggunaan vektorisasi dan penyiaran untuk menerapkan operasi ke seluruh larik sekaligus, bukan satu elemen dalam satu waktu.

Mari kita hasilkan beberapa data dengan membuat array 3x4 NumPy dari angka acak semu

>>> ________79______7

Pertama, kita seed modul

>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
_89 sehingga Anda dapat mereproduksi hasilnya dengan mudah. Kemudian array 3×4 NumPy angka floating-point dibuat dengan
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
90

Catatan. Anda harus

>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
_91 sebelum mengetik kode di atas ke dalam REPL Anda jika Anda belum memiliki NumPy di ​​lingkungan Anda. Jika Anda menginstal Python dengan Anaconda, Anda sudah siap

Jika Anda belum pernah menggunakan NumPy sebelumnya, Anda bisa mendapatkan pengantar cepat di bagian Look Ma Brad Solomon, No For-Loops. Pemrograman Array Dengan NumPy di ​​sini di Real Python

Untuk informasi lebih lanjut tentang modul acak NumPy, lihat bagian Brad Menghasilkan Data Acak dengan Python (Panduan)

Untuk membulatkan semua nilai dalam larik

>>> def truncate(n):
..     return int(n * 1000) / 1000
_28, Anda dapat meneruskan
>>> def truncate(n):
..     return int(n * 1000) / 1000
28 sebagai argumen ke fungsi. Jumlah tempat desimal yang diinginkan ditetapkan dengan argumen kata kunci
>>> round(1.5)
2
54. Strategi setengah putaran ke genap digunakan, seperti fungsi
def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
9 bawaan Python

Misalnya, berikut ini membulatkan semua nilai dalam

>>> def truncate(n):
..     return int(n * 1000) / 1000
28 menjadi tiga tempat desimal

>>> ________79______8

>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
_94 bergantung pada kesalahan representasi titik-mengambang, seperti halnya
def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
9

Misalnya, nilai di baris ketiga dari kolom pertama di

>>> def truncate(n):
..     return int(n * 1000) / 1000
28 array adalah
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
01. Ketika Anda membulatkannya ke tiga tempat desimal menggunakan strategi "membulatkan setengah ke genap", Anda mengharapkan nilainya menjadi
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
02. Tapi Anda bisa melihat di output dari
>>> import random
>>> random.seed(100)

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     truncated_value = truncate(truncated_value + randn)
...

>>> actual_value
96.45273913513529

>>> truncated_value
0.239
94 bahwa nilainya dibulatkan menjadi
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
04. Namun, nilai
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
05 di baris pertama kolom kedua dibulatkan dengan benar menjadi
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
06

Jika Anda perlu membulatkan data dalam array Anda menjadi bilangan bulat, NumPy menawarkan beberapa opsi

  • >>> random.seed(100)
    >>> actual_value, rounded_value = 100, 100
    
    >>> for _ in range(1000000):
    ..     randn = random.uniform(-0.05, 0.05)
    ..     actual_value = actual_value + randn
    ..     rounded_value = round(rounded_value + randn, 3)
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> rounded_value
    96.258
    
    _07
  • >>> random.seed(100)
    >>> actual_value, rounded_value = 100, 100
    
    >>> for _ in range(1000000):
    ..     randn = random.uniform(-0.05, 0.05)
    ..     actual_value = actual_value + randn
    ..     rounded_value = round(rounded_value + randn, 3)
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> rounded_value
    96.258
    
    _08
  • >>> random.seed(100)
    >>> actual_value, rounded_value = 100, 100
    
    >>> for _ in range(1000000):
    ..     randn = random.uniform(-0.05, 0.05)
    ..     actual_value = actual_value + randn
    ..     rounded_value = round(rounded_value + randn, 3)
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> rounded_value
    96.258
    
    _09
  • >>> random.seed(100)
    >>> actual_value, rounded_value = 100, 100
    
    >>> for _ in range(1000000):
    ..     randn = random.uniform(-0.05, 0.05)
    ..     actual_value = actual_value + randn
    ..     rounded_value = round(rounded_value + randn, 3)
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> rounded_value
    96.258
    
    10

Fungsi

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
_11 membulatkan setiap nilai dalam larik ke bilangan bulat terdekat yang lebih besar atau sama dengan nilai aslinya

>>>

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
9

Hei, kami menemukan nomor baru. Nol negatif

Sebenarnya, standar IEEE-754 mensyaratkan penerapan nol positif dan negatif. Apa kemungkinan gunanya untuk hal seperti ini?

Secara informal, seseorang dapat menggunakan notasi “

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
12” untuk nilai negatif yang dibulatkan menjadi nol. Notasi ini mungkin berguna ketika tanda negatif signifikan; . ()

Untuk membulatkan setiap nilai ke bilangan bulat terdekat, gunakan

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
13

>>>

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
0

Anda juga dapat memotong setiap nilai menjadi komponen bilangan bulatnya dengan

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
14

>>>

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
1

Terakhir, untuk membulatkan ke bilangan bulat terdekat menggunakan strategi “membulatkan setengah ke genap”, gunakan

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
15

>>>

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
2

Anda mungkin telah memperhatikan bahwa banyak strategi pembulatan yang telah kita bahas sebelumnya hilang di sini. Untuk sebagian besar situasi, fungsi ________79______16 adalah semua yang Anda butuhkan. Jika Anda perlu menerapkan strategi lain, seperti

>>> def truncate(n):
..     return int(n * 1000) / 1000
68, Anda dapat melakukannya dengan modifikasi sederhana

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
_3

Berkat operasi vektorisasi NumPy, ini berfungsi seperti yang Anda harapkan

>>>

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
4

Sekarang setelah Anda adalah master pembulatan NumPy, mari kita lihat kelas berat ilmu data Python lainnya. perpustakaan panda

Hilangkan iklan

Membulatkan Panda >>> random.seed(100) >>> actual_value, rounded_value = 100, 100 >>> for _ in range(1000000): .. randn = random.uniform(-0.05, 0.05) .. actual_value = actual_value + randn .. rounded_value = round(rounded_value + randn, 3) ... >>> actual_value 96.45273913513529 >>> rounded_value 96.258 18 dan >>> random.seed(100) >>> actual_value, rounded_value = 100, 100 >>> for _ in range(1000000): .. randn = random.uniform(-0.05, 0.05) .. actual_value = actual_value + randn .. rounded_value = round(rounded_value + randn, 3) ... >>> actual_value 96.45273913513529 >>> rounded_value 96.258 19

Pustaka Panda telah menjadi bahan pokok bagi ilmuwan data dan analis data yang bekerja dengan Python. Dalam kata-kata Joe Wyndham dari Real Python

Pandas adalah pengubah permainan untuk ilmu data dan analitik, terutama jika Anda datang ke Python karena Anda sedang mencari sesuatu yang lebih kuat daripada Excel dan VBA. (Sumber)

Catatan. Sebelum Anda melanjutkan, Anda harus

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
20 jika Anda belum memilikinya di lingkungan Anda. Seperti halnya NumPy, jika Anda menginstal Python dengan Anaconda, Anda harus siap untuk pergi

Dua struktur data utama Panda adalah

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
19, yang dalam istilah yang sangat longgar berfungsi seperti spreadsheet Excel, dan
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
18, yang dapat Anda anggap sebagai kolom dalam spreadsheet. Kedua objek
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
18 dan
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
19 juga dapat dibulatkan secara efisien menggunakan metode
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
25 dan ________79______26

>>>

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
5

Metode

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
_26 juga dapat menerima kamus atau
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
18, untuk menentukan presisi yang berbeda untuk setiap kolom. Misalnya, contoh berikut menunjukkan cara membulatkan kolom pertama dari
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
29 ke satu tempat desimal, kolom kedua ke dua, dan kolom ketiga ke tiga tempat desimal

>>>

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
6

Jika Anda membutuhkan lebih banyak fleksibilitas pembulatan, Anda dapat menerapkan fungsi

>>> def truncate(n):
..     return int(n * 1000) / 1000
02,
>>> round(1.5)
2
55, dan
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
32 NumPy ke objek Pandas
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
18 dan
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
19

>>>

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
7

Fungsi

>>> def truncate(n):
..     return int(n * 1000) / 1000
_68 yang dimodifikasi dari bagian sebelumnya juga akan berfungsi di sini

>>>

def truncate(n, decimals=0):
    multiplier = 10 ** decimals
    return int(n * multiplier) / multiplier
8

Selamat, Anda sedang menuju penguasaan yang sempurna. Anda sekarang tahu bahwa ada lebih banyak cara untuk membulatkan angka daripada kombinasi taco. (Yah… mungkin tidak. ) Anda dapat menerapkan banyak strategi pembulatan dengan Python murni, dan Anda telah mempertajam keterampilan Anda dalam membulatkan array NumPy dan Panda

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
18 dan
>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
19 objek

Tinggal satu langkah lagi. mengetahui kapan menerapkan strategi yang tepat

Aplikasi dan Praktik Terbaik

Peregangan terakhir di jalan Anda menuju keahlian pembulatan adalah memahami kapan harus menerapkan pengetahuan yang baru Anda temukan. Di bagian ini, Anda akan mempelajari beberapa praktik terbaik untuk memastikan Anda membulatkan angka dengan benar

Simpan Lebih Banyak dan Putaran Terlambat

Saat Anda berurusan dengan kumpulan data yang besar, penyimpanan bisa menjadi masalah. Di sebagian besar database relasional, setiap kolom dalam tabel dirancang untuk menyimpan tipe data tertentu, dan tipe data numerik sering kali diberi presisi untuk membantu menghemat memori.

Misalnya, sensor suhu dapat melaporkan suhu dalam oven industri yang sudah lama beroperasi setiap sepuluh detik dengan akurat hingga delapan desimal. Pembacaan dari ini digunakan untuk mendeteksi fluktuasi suhu yang tidak normal yang dapat mengindikasikan kegagalan elemen pemanas atau beberapa komponen lainnya. Jadi, mungkin ada skrip Python yang berjalan yang membandingkan setiap pembacaan yang masuk dengan yang terakhir untuk memeriksa fluktuasi yang besar

Pembacaan dari sensor ini juga disimpan dalam database SQL sehingga suhu rata-rata harian di dalam oven dapat dihitung setiap hari pada tengah malam. Pabrikan elemen pemanas di dalam oven merekomendasikan untuk mengganti komponen setiap kali suhu rata-rata harian turun

>>> random.seed(100)
>>> actual_value, rounded_value = 100, 100

>>> for _ in range(1000000):
..     randn = random.uniform(-0.05, 0.05)
..     actual_value = actual_value + randn
..     rounded_value = round(rounded_value + randn, 3)
...

>>> actual_value
96.45273913513529

>>> rounded_value
96.258
38 derajat di bawah normal

Untuk perhitungan ini, Anda hanya memerlukan ketepatan tiga angka desimal. Tapi Anda tahu dari kejadian di Bursa Efek Vancouver bahwa menghapus terlalu banyak presisi dapat mempengaruhi perhitungan Anda secara drastis

Jika Anda memiliki ruang yang tersedia, Anda harus menyimpan data dengan presisi penuh. Jika penyimpanan menjadi masalah, aturan praktis yang baik adalah menyimpan setidaknya dua atau tiga tempat desimal presisi lebih dari yang Anda perlukan untuk perhitungan Anda

Terakhir, saat Anda menghitung suhu rata-rata harian, Anda harus menghitungnya dengan ketelitian penuh yang tersedia dan membulatkan jawaban akhir

Hilangkan iklan

Patuhi Peraturan Mata Uang Lokal

Ketika Anda memesan secangkir kopi seharga $2. 40 di kedai kopi, pedagang biasanya menambahkan pajak yang diwajibkan. Jumlah pajak itu sangat bergantung pada lokasi Anda secara geografis, tetapi demi argumen, katakanlah 6%. Pajak yang akan ditambahkan keluar menjadi $0. 144. Haruskah Anda membulatkannya menjadi $0. 15 atau turun ke $0. 14?

Situasi seperti ini juga bisa muncul saat Anda mengonversi satu mata uang ke mata uang lainnya. Pada tahun 1999, Komisi Eropa untuk Urusan Ekonomi dan Keuangan mengkodifikasikan penggunaan strategi "pembulatan setengah menjauh dari nol" saat mengonversi mata uang ke Euro, tetapi mata uang lain mungkin mengadopsi peraturan yang berbeda.

Skenario lain, "pembulatan Swedia", terjadi ketika unit mata uang minimum pada tingkat akuntansi di suatu negara lebih kecil dari unit mata uang fisik terendah. Misalnya, jika secangkir kopi berharga $2. 54 setelah pajak, tetapi tidak ada koin 1 sen yang beredar, apa yang Anda lakukan?

Bagaimana situasi seperti ini ditangani biasanya ditentukan oleh pemerintah suatu negara. Anda dapat menemukan daftar metode pembulatan yang digunakan oleh berbagai negara di Wikipedia

Jika Anda merancang perangkat lunak untuk menghitung mata uang, Anda harus selalu memeriksa undang-undang dan peraturan setempat di lokasi pengguna Anda

Jika Ragu-ragu, Bulatkan Ikatan Menjadi Genap

Saat Anda membulatkan angka dalam kumpulan data besar yang digunakan dalam perhitungan kompleks, perhatian utama adalah membatasi pertumbuhan kesalahan karena pembulatan

Dari semua metode yang telah kita bahas dalam artikel ini, strategi "pembulatan setengah ke genap" paling baik meminimalkan bias pembulatan. Untungnya, Python, NumPy, dan Panda semuanya default untuk strategi ini, jadi dengan menggunakan fungsi pembulatan bawaan Anda sudah terlindungi dengan baik

Ringkasan

Wah. Perjalanan yang luar biasa ini

Di artikel ini, Anda mempelajarinya

  • Ada berbagai strategi pembulatan, yang sekarang Anda ketahui cara menerapkannya dengan Python murni

  • Setiap strategi pembulatan secara inheren memperkenalkan bias pembulatan, dan strategi "pembulatan setengah ke genap" mengurangi bias ini dengan baik, sebagian besar waktu

  • Cara komputer menyimpan angka floating-point dalam memori secara alami memperkenalkan kesalahan pembulatan halus, tetapi Anda belajar cara mengatasinya dengan modul

    >>> actual_value, truncated_value = 100, 100
    
    12 di pustaka standar Python

  • Anda dapat membulatkan array NumPy dan objek Pandas

    >>> random.seed(100)
    >>> actual_value, rounded_value = 100, 100
    
    >>> for _ in range(1000000):
    ..     randn = random.uniform(-0.05, 0.05)
    ..     actual_value = actual_value + randn
    ..     rounded_value = round(rounded_value + randn, 3)
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> rounded_value
    96.258
    
    18 dan
    >>> random.seed(100)
    >>> actual_value, rounded_value = 100, 100
    
    >>> for _ in range(1000000):
    ..     randn = random.uniform(-0.05, 0.05)
    ..     actual_value = actual_value + randn
    ..     rounded_value = round(rounded_value + randn, 3)
    ...
    
    >>> actual_value
    96.45273913513529
    
    >>> rounded_value
    96.258
    
    19

  • Ada praktik terbaik untuk pembulatan dengan data dunia nyata

Ikuti Kuis. Uji pengetahuan Anda dengan kuis "Angka Pembulatan dengan Python" interaktif kami. Setelah selesai Anda akan menerima skor sehingga Anda dapat melacak kemajuan belajar Anda dari waktu ke waktu

Ikuti Kuis »

Jika Anda tertarik untuk mempelajari lebih lanjut dan menggali seluk-beluk detail dari semua yang telah kami bahas, tautan di bawah ini akan membuat Anda sibuk cukup lama

Paling tidak, jika Anda menikmati artikel ini dan mempelajari sesuatu yang baru darinya, teruskan ke teman atau anggota tim. Pastikan untuk berbagi pemikiran Anda dengan kami di komentar. Kami ingin mendengar beberapa cerita pertempuran Anda yang berhubungan dengan pembulatan

Selamat Pythoning

Sumber daya tambahan

Strategi pembulatan dan bias

  • Pembulatan, Wikipedia
  • Membulatkan Angka tanpa Menambahkan Bias, dari ZipCPU

Spesifikasi floating-point dan desimal

  • IEEE-754, Wikipedia
  • Spesifikasi Aritmatika Desimal Umum IBM

Bacaan Menarik

  • Yang Harus Diketahui Setiap Ilmuwan Komputer Tentang Aritmatika Titik-Mengambang, David Goldberg, Survei Komputasi ACM, Maret 1991
  • Aritmatika Titik Terapung. Masalah dan Keterbatasan, dari python. org
  • Mengapa Lantai Divisi Integer Python, oleh Guido van Rossum

Tandai sebagai Selesai

🐍 Trik Python 💌

Dapatkan Trik Python singkat & manis yang dikirim ke kotak masuk Anda setiap beberapa hari. Tidak pernah ada spam. Berhenti berlangganan kapan saja. Dikuratori oleh tim Real Python

0,0 hingga 0 dengan python

Kirimi Saya Trik Python »

Tentang David Amos

0,0 hingga 0 dengan python
0,0 hingga 0 dengan python

David adalah seorang penulis, pemrogram, dan ahli matematika yang bersemangat menjelajahi matematika melalui kode

» Lebih lanjut tentang Daud


Setiap tutorial di Real Python dibuat oleh tim pengembang sehingga memenuhi standar kualitas tinggi kami. Anggota tim yang mengerjakan tutorial ini adalah

0,0 hingga 0 dengan python

Adriana

0,0 hingga 0 dengan python

Geir Arne

0,0 hingga 0 dengan python

Joanna

Master Keterampilan Python Dunia Nyata Dengan Akses Tanpa Batas ke Python Nyata

Bergabunglah dengan kami dan dapatkan akses ke ribuan tutorial, kursus video langsung, dan komunitas pakar Pythonista

Tingkatkan Keterampilan Python Anda »

Guru Keterampilan Python Dunia Nyata
Dengan Akses Tak Terbatas ke Real Python

Bergabunglah dengan kami dan dapatkan akses ke ribuan tutorial, kursus video langsung, dan komunitas ahli Pythonista

Tingkatkan Keterampilan Python Anda »

Bagaimana menurut anda?

Nilai artikel ini

Tweet Bagikan Bagikan Email

Apa takeaway # 1 Anda atau hal favorit yang Anda pelajari?

Kiat Berkomentar. Komentar yang paling berguna adalah yang ditulis dengan tujuan belajar dari atau membantu siswa lain. dan dapatkan jawaban atas pertanyaan umum di portal dukungan kami

Apakah 0. 0 sama dengan 0 di Python?

Ketika int dan float dibandingkan, integer diubah menjadi float dan kemudian dibandingkan. Jadi, tidak ada perbedaan saat membandingkan 0. 0 dan 0 .

Apa. 0f artinya dengan Python?

Ringkasan. Pada artikel ini, kita berbicara tentang formatter %f dengan Python. Anda menggunakannya untuk memformat angka floating point . Bergantung pada parameter yang disediakan, pemformat %f membulatkan nilai float ke desimal terdekat yang disediakan.

Bagaimana Anda mengonversi 0 menjadi float dengan Python?

Untuk mengonversi integer menjadi float dengan Python, kita dapat menggunakan fungsi bawaan float() atau konversi implisit .

Bagaimana. 2f bekerja dengan Python?

Format dari. 2f (perhatikan f ) berarti menampilkan angka dengan dua digit setelah titik desimal . Jadi angka 1 akan ditampilkan sebagai 1. 00 dan angka 1. 5555 akan ditampilkan sebagai 1. 56.

Bagaimana Anda mendapatkan tempat desimal nol dengan Python?

Gunakan kelas int() untuk mendapatkan angka tanpa desimal , e. g. hasil = int(float_saya). Kelas int() memotong angka titik-mengambang menuju nol, sehingga akan mengembalikan int yang mewakili angka tanpa tempat desimal. Disalin.