[{"data":1,"prerenderedAt":284},["ShallowReactive",2],{"tag-labels":3,"site-header":4,"article-java-operators-id":72},{},{"featuredPost":5,"navigations":29},{"id":6,"title":7,"title_id":8,"slug":9,"excerpt":10,"excerpt_id":11,"has_translation":12,"published_at":13,"reading_time":14,"hidden_from_listing":15,"tags":16,"thumbnail_image":21,"og_image":22,"series":23,"authors":28},110,"When You Pick a Framework Just to Look Different","Ketika Pilih Framework Cuma Biar Kelihatan Beda","ketika-pilih-framework-cuma-biar-kelihatan-beda","The last time you chose a new framework or library, was it because your problem needed that tool, or because it sounded cool and few people around you were using it? That question is uncomfortable. Technology decisions are often made for reasons that never appear in any technical document.","Terakhir kali kamu milih framework atau library baru, itu karena masalahmu butuh alat itu, atau karena alatnya kedengaran keren dan belum banyak yang pakai? Pertanyaan ini nggak enak dijawab. Soalnya keputusan teknologi sering diambil dengan alasan yang nggak pernah ditulis di dokumen teknis mana pun.",true,"2026-10-06T15:25:21.000Z",5,false,[17,18,19,20],"karier","framework","opini","pengalaman",null,"\u002Fog\u002Fketika-pilih-framework-cuma-biar-kelihatan-beda.png",{"id":24,"title":25,"title_id":26,"slug":27},9,"Articles","Artikel","all",[],[30,46,67],{"collection":31,"item":32},"series",{"__typename":31,"title":25,"title_id":26,"slug":27,"children_series":33},[34,38,42],{"title":35,"title_id":36,"slug":37},"Artificial Intelligence","Kecerdasan Artifisial","kecerdasan-artifisial",{"title":39,"title_id":40,"slug":41},"Programming Fundamentals","Konsep Dasar Pemrograman","konsep-dasar-pemrograman",{"title":43,"title_id":44,"slug":45},"Algorithms and Data Structures","Algoritma dan Struktur Data","algoritma-struktur-data",{"collection":31,"item":47},{"__typename":31,"title":48,"title_id":48,"slug":49,"children_series":50},"Tutorial","tutorial",[51,55,59,63],{"title":52,"title_id":53,"slug":54},"Learning Python","Belajar Python","belajar-python",{"title":56,"title_id":57,"slug":58},"Learning Go","Belajar Golang","belajar-golang",{"title":60,"title_id":61,"slug":62},"Learning Java","Belajar Java","belajar-java",{"title":64,"title_id":65,"slug":66},"Learning Pascal","Belajar Pascal","belajar-pascal",{"collection":31,"item":68},{"__typename":31,"title":69,"title_id":69,"slug":70,"children_series":71},"Lab","lab",[],{"article":73,"renderedBody":171,"renderedTakeaway":172,"latestArticles":173,"toc":264},{"id":74,"title":75,"title_id":75,"slug":76,"excerpt":77,"excerpt_id":77,"has_translation":12,"published_at":78,"reading_time":14,"hidden_from_listing":15,"tags":79,"thumbnail_image":21,"og_image":82,"series":83,"authors":163,"seoTitle":21,"seoDescription":21,"body_locale":166,"available_locales":167,"body":169,"takeway":170,"prerequisite":21},137,"Operator Java: Rata-Rata yang Keluar Sebagai Bilangan Bulat","java-operators","Tiga nilai, satu pembagian, dan rata-ratanya tercetak 82. Kedua operand-nya `int`, jadi pecahannya dipotong, dan cast yang paling wajar malah mencetak `82.0` tanpa memperbaiki apa pun.","2026-11-06T01:00:00.000Z",[80,81],"java","operator","\u002Fog\u002Fjava-operators.png",{"id":84,"title":85,"title_id":86,"slug":87,"description":88,"description_id":89,"articles":90,"children_series":152,"parent_series":153},22,"Variables, Types, and Operations","Variabel, Tipe Data, dan Operasi","java-variabel-tipe-data","In Java the type has to be clear from the start. We go through the primitive types, then integers and floats in more depth.","Tipe data di Java harus jelas dari awal. Kita bahas tipe data dasar, plus integer dan float lebih dalam.",[91,113,129,145],{"id":92,"title":93,"title_id":94,"slug":95,"excerpt":96,"excerpt_id":97,"has_translation":12,"published_at":98,"reading_time":99,"hidden_from_listing":15,"tags":100,"thumbnail_image":21,"og_image":104,"series":105,"authors":106},56,"Data Types in the Java Language","Tipe Data pada Bahasa Java","tipe-data-pada-bahasa-java","A data type is an attribute that sticks to a piece of data and decides how that data can be treated.","Tipe data adalah atribut yang menempel pada sebuah data untuk menentukan perlakuan terhadap data tersebut.","2022-12-29T00:00:00.000Z",3,[80,101,102,103],"tipe-data","konsep","dasar","\u002Fog\u002Ftipe-data-pada-bahasa-java.png",{"id":84,"title":85,"title_id":86,"slug":87},[107],{"authors_id":108},{"id":109,"name":110,"slug":111,"role":112,"profile_picture":21},1,"Daffa Izzuddin","izzudd","Writer",{"id":114,"title":115,"title_id":116,"slug":117,"excerpt":118,"excerpt_id":119,"has_translation":12,"published_at":120,"reading_time":121,"hidden_from_listing":15,"tags":122,"thumbnail_image":21,"og_image":124,"series":125,"authors":126},57,"Getting to Know the Integer Data Type in Java","Mengenal Tipe Data Integer pada Java","mengenal-tipe-data-integer-pada-java","Integer, as the name suggests, is a data type that only holds whole numbers (negative, zero, and positive).","Integer, sesuai namanya merupakan tipe data yang hanya bisa menampung bilangan bulat saja (negatif, nol, dan positif)","2023-01-13T00:00:00.000Z",6,[80,101,123],"integer","\u002Fog\u002Fmengenal-tipe-data-integer-pada-java.png",{"id":84,"title":85,"title_id":86,"slug":87},[127],{"authors_id":128},{"id":109,"name":110,"slug":111,"role":112,"profile_picture":21},{"id":130,"title":131,"title_id":132,"slug":133,"excerpt":134,"excerpt_id":135,"has_translation":12,"published_at":136,"reading_time":137,"hidden_from_listing":15,"tags":138,"thumbnail_image":21,"og_image":140,"series":141,"authors":142},58,"Getting to Know the Float Data Type in Java","Mengenal Tipe Data Float pada Java","mengenal-tipe-data-float-pada-java","Float, or floating point, is a data type that holds decimal and fractional number literals.","Float atau floating point merupakan tipe data yang dapat menampung literal bilangan desimal dan pecahan.","2023-02-15T00:00:00.000Z",4,[80,101,139],"float","\u002Fog\u002Fmengenal-tipe-data-float-pada-java.png",{"id":84,"title":85,"title_id":86,"slug":87},[143],{"authors_id":144},{"id":109,"name":110,"slug":111,"role":112,"profile_picture":21},{"id":74,"title":146,"title_id":75,"slug":76,"excerpt":147,"excerpt_id":77,"has_translation":12,"published_at":78,"reading_time":14,"hidden_from_listing":15,"tags":79,"thumbnail_image":21,"og_image":82,"series":148,"authors":149},"Java Operators: the Average That Came Out a Whole Number","Three scores, one division, and the average prints as 82. Both operands are `int`, so the fraction is cut off, and the obvious cast prints `82.0` without fixing anything.",{"id":84,"title":85,"title_id":86,"slug":87},[150],{"authors_id":151},{"id":109,"name":110,"slug":111,"role":112,"profile_picture":21},[],{"id":154,"title":60,"title_id":61,"slug":62,"parent_series":155,"children_series":156},13,{"id":109,"title":48,"title_id":48,"slug":49},[157,162],{"id":158,"title":159,"title_id":160,"slug":161,"cover_image":21},21,"Getting Started with Java","Berkenalan dengan Java","java-intro",{"id":84,"title":85,"title_id":86,"slug":87,"cover_image":21},[164],{"authors_id":165},{"id":109,"name":110,"slug":111,"role":112,"profile_picture":21},"id",[168,166],"en","\nKamu menjumlahkan tiga nilai ujian, membaginya dengan tiga, lalu mencetak hasilnya. Program mencetak `82`, padahal angka yang seharusnya keluar adalah 82,33. Tidak ada error dan tidak ada peringatan. Compiler menerima semua barisnya, dan 82 adalah nilai yang masuk akal, itu sebabnya angka ini lolos.\n\nArtikel ini hanya memakai satu file kecil: kamu akan meng-compile-nya, menjalankannya, melihat angka yang salah, mengubah satu hal, lalu menjalankannya lagi.\n\n## Program yang mencetak 82\n\nSimpan file ini sebagai `Average.java`. Isinya tiga nilai, penjumlahan di dalam loop, lalu jumlah itu dibagi panjang array.\n\n```java\n\u002F\u002F Average.java\npublic class Average {\n    public static void main(String[] args) {\n        int[] scores = {80, 75, 92};\n        int sum = 0;\n        for (int score : scores) {\n            sum += score;\n        }\n        int average = sum \u002F scores.length;\n        System.out.println(\"sum: \" + sum);\n        System.out.println(\"average: \" + average);\n    }\n}\n```\n\nCompile dan jalankan dengan dua perintah:\n\n```console\njavac Average.java\njava Average\n```\n\nHasilnya seperti ini:\n\n```\nsum: 247\naverage: 82\n```\n\nJumlahnya benar, karena 80 + 75 + 92 adalah 247. Rata-ratanya tidak, karena 247 \u002F 3 adalah 82,33. Baris `int average = sum \u002F scores.length;` terbaca seperti rumus di buku, jadi orang yang me-review melihat jumlah dibagi cacah data lalu lanjut. Output-nya bilangan bulat di rentang yang wajar. Tidak ada yang tampak rusak dari `82`.\n\n## Apa yang dilakukan `\u002F` kalau kedua sisinya int\n\nJVM menentukan tipe hasil pembagian dari dua operand-nya. Di sini `sum` bertipe `int` dan `scores.length` juga `int`, jadi `\u002F` melakukan pembagian bulat dan hasilnya `int`. Tipe `int` tidak punya ruang untuk pecahan, jadi pecahannya dibuang.\n\nDibuang tidak sama dengan dibulatkan. Pecahannya **dipotong**. `247 \u002F 3` adalah `82`, dan `5 \u002F 2` adalah `2`, padahal pembulatan akan memberimu 3. Angka 33 di belakang koma itu tidak pernah sampai ke program.\n\nOperator `%` memberimu bagian yang tadi dibuang. `247 % 3` adalah `1`: angka 3 masuk ke 247 sebanyak delapan puluh dua kali, dan tersisa 1. Gabungkan keduanya dan tidak ada yang hilang, karena 82 * 3 + 1 adalah 247.\n\n## Cast sebelum pembagian, bukan sesudahnya\n\nPerbaikan yang paling kelihatan benar adalah meminta `double`. Ubah barisnya jadi seperti ini:\n\n`double average = (double) (sum \u002F scores.length);`\n\nBaris ini lolos compile tanpa peringatan dan mencetak `82.0`. Bentuknya `double`, dan `double` terlihat presisi, tapi itu bukan rata-ratanya. Tanda kurung membuat pembagiannya berjalan lebih dulu, di `int`, dan hasilnya 82. Cast-nya baru kemudian melebarkan 82 menjadi 82.0. Kerusakannya sudah terjadi sebelum cast mendapat giliran.\n\nCast-nya harus menempel pada operand: `(double) sum \u002F scores.length`. Cast mengikat lebih kuat daripada `\u002F`, jadi `sum` berubah jadi `double` lebih dulu. Dengan satu `double` di sisi kiri, Java melebarkan operand lainnya supaya cocok lalu membagi dalam floating point. Hasilnya `82.33333333333333`.\n\nBerikut file yang sudah diperbaiki. Tipe `average` diganti, cast-nya dipindah ke `sum`, dan ada satu baris tambahan yang mencetak sisa pembagian tadi.\n\n```java\n\u002F\u002F Average.java\npublic class Average {\n    public static void main(String[] args) {\n        int[] scores = {80, 75, 92};\n        int sum = 0;\n        for (int score : scores) {\n            sum += score;\n        }\n        double average = (double) sum \u002F scores.length;\n        System.out.println(\"sum: \" + sum);\n        System.out.println(\"average: \" + average);\n        System.out.println(\"remainder: \" + sum % scores.length);\n    }\n}\n```\n\nJalankan dua perintah yang sama:\n\n```\nsum: 247\naverage: 82.33333333333333\nremainder: 1\n```\n\n## Prioritas operator dan sisanya\n\nPerkalian, pembagian, dan sisa bagi mengikat lebih kuat daripada penjumlahan dan pengurangan. Jadi `1 + 2 * 3` adalah `7`, sementara `(1 + 2) * 3` adalah `9`. Tanda kurung mengubah operasi mana yang jalan lebih dulu. Bug cast tadi adalah kesalahan sejenis: urutan evaluasi Java yang menentukan jawabannya.\n\nPembagian bulat muncul juga di luar rata-rata. `10 \u002F 3` adalah `3`. Ubah satu operand jadi `double` dan `10.0 \u002F 3` adalah `3.3333333333333335`. Satu `.0` di satu sisi mengubah bilangan bulat jadi pecahan panjang.\n\nLihat lagi dua hasil panjang tadi. `82.33333333333333` dan `3.3333333333333335` tidak berakhir seperti yang kamu tulis di kertas. Dari situ muncul satu hal yang tidak diselesaikan artikel ini.\n\n## Yang tidak dibahas di sini\n\n`double` tidak bisa menampung setiap desimal dengan tepat. Ia menyimpan pecahan biner, dan nilai seperti 0,1 tidak punya bentuk biner yang pas. Jumlahkan dua di antaranya dan celahnya kelihatan: `0.1 + 0.2` adalah `0.30000000000000004`.\n\nUntuk uang, celah itu penting, dan Java punya `BigDecimal` untuk itu. Kita tidak memakainya di sini. Rata-rata nilai ujian bukan uang. Errornya jauh di belakang digit yang mungkin dipedulikan pembaca nilai, jadi `double` adalah alat yang tepat untuk program ini.\n\n## Sebelum artikel berikutnya\n\nUbah satu nilai supaya ketiganya berjumlah 246: pakai 80, 75, dan 91. Jalankan versi awal, lalu versi yang sudah diperbaiki. Ini yang saya ukur. Versi yang memotong pecahan mencetak `82`, dan versi ber-cast mencetak `82.0`. Keduanya sepakat, dan tidak ada jawaban yang tampak salah, karena 246 habis dibagi 3.\n\nData yang habis dibagi menyembunyikan bug-nya. Tugasmu: jelaskan dengan kata-katamu sendiri kenapa bug itu kembali begitu jumlahnya tidak habis dibagi cacah data.\n\nKalau satu hasil terlihat benar di satu input, input mana yang akan membuatnya salah?\n","- `int \u002F int` adalah pembagian bulat: pecahannya dipotong, bukan dibulatkan, jadi `247 \u002F 3` adalah `82`.\n- `%` mengembalikan bagian yang dibuang pembagian: `247 % 3` adalah `1`.\n- Melakukan cast pada hasilnya (`(double) (sum \u002F count)`) mencetak `82.0`, karena pembagiannya sudah selesai di `int`.\n- Cast salah satu operand (`(double) sum \u002F count`) untuk membagi dalam floating point dan mendapat `82.33333333333333`.\n- `double` tidak bisa menampung setiap desimal, karena `0.1 + 0.2` adalah `0.30000000000000004`, itu sebabnya uang memakai `BigDecimal`.\n- Input uji yang habis dibagi, seperti 246 dibagi 3, menyembunyikan bug ini di kedua versi.","\u003Cp>Kamu menjumlahkan tiga nilai ujian, membaginya dengan tiga, lalu mencetak hasilnya. Program mencetak \u003Ccode>82\u003C\u002Fcode>, padahal angka yang seharusnya keluar adalah 82,33. Tidak ada error dan tidak ada peringatan. Compiler menerima semua barisnya, dan 82 adalah nilai yang masuk akal, itu sebabnya angka ini lolos.\u003C\u002Fp>\n\u003Cp>Artikel ini hanya memakai satu file kecil: kamu akan meng-compile-nya, menjalankannya, melihat angka yang salah, mengubah satu hal, lalu menjalankannya lagi.\u003C\u002Fp>\n\u003Ch2 id=\"program-yang-mencetak-82\">Program yang mencetak 82\u003C\u002Fh2>\n\u003Cp>Simpan file ini sebagai \u003Ccode>Average.java\u003C\u002Fcode>. Isinya tiga nilai, penjumlahan di dalam loop, lalu jumlah itu dibagi panjang array.\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">JAVA\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"%2F%2F%20Average.java%0Apublic%20class%20Average%20%7B%0A%20%20%20%20public%20static%20void%20main(String%5B%5D%20args)%20%7B%0A%20%20%20%20%20%20%20%20int%5B%5D%20scores%20%3D%20%7B80%2C%2075%2C%2092%7D%3B%0A%20%20%20%20%20%20%20%20int%20sum%20%3D%200%3B%0A%20%20%20%20%20%20%20%20for%20(int%20score%20%3A%20scores)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20sum%20%2B%3D%20score%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20int%20average%20%3D%20sum%20%2F%20scores.length%3B%0A%20%20%20%20%20%20%20%20System.out.println(%22sum%3A%20%22%20%2B%20sum)%3B%0A%20%20%20%20%20%20%20%20System.out.println(%22average%3A%20%22%20%2B%20average)%3B%0A%20%20%20%20%7D%0A%7D\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Copy\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>\u002F\u002F Average.java\npublic class Average {\n    public static void main(String[] args) {\n        int[] scores = {80, 75, 92};\n        int sum = 0;\n        for (int score : scores) {\n            sum += score;\n        }\n        int average = sum \u002F scores.length;\n        System.out.println(\"sum: \" + sum);\n        System.out.println(\"average: \" + average);\n    }\n}\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Compile dan jalankan dengan dua perintah:\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">CONSOLE\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"javac%20Average.java%0Ajava%20Average\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Copy\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>javac Average.java\njava Average\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Hasilnya seperti ini:\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">TEXT\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"sum%3A%20247%0Aaverage%3A%2082\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Copy\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>sum: 247\naverage: 82\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Jumlahnya benar, karena 80 + 75 + 92 adalah 247. Rata-ratanya tidak, karena 247 \u002F 3 adalah 82,33. Baris \u003Ccode>int average = sum \u002F scores.length;\u003C\u002Fcode> terbaca seperti rumus di buku, jadi orang yang me-review melihat jumlah dibagi cacah data lalu lanjut. Output-nya bilangan bulat di rentang yang wajar. Tidak ada yang tampak rusak dari \u003Ccode>82\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch2 id=\"apa-yang-dilakukan-kalau-kedua-sisinya-int\">Apa yang dilakukan \u003Ccode>\u002F\u003C\u002Fcode> kalau kedua sisinya int\u003C\u002Fh2>\n\u003Cp>JVM menentukan tipe hasil pembagian dari dua operand-nya. Di sini \u003Ccode>sum\u003C\u002Fcode> bertipe \u003Ccode>int\u003C\u002Fcode> dan \u003Ccode>scores.length\u003C\u002Fcode> juga \u003Ccode>int\u003C\u002Fcode>, jadi \u003Ccode>\u002F\u003C\u002Fcode> melakukan pembagian bulat dan hasilnya \u003Ccode>int\u003C\u002Fcode>. Tipe \u003Ccode>int\u003C\u002Fcode> tidak punya ruang untuk pecahan, jadi pecahannya dibuang.\u003C\u002Fp>\n\u003Cp>Dibuang tidak sama dengan dibulatkan. Pecahannya \u003Cstrong>dipotong\u003C\u002Fstrong>. \u003Ccode>247 \u002F 3\u003C\u002Fcode> adalah \u003Ccode>82\u003C\u002Fcode>, dan \u003Ccode>5 \u002F 2\u003C\u002Fcode> adalah \u003Ccode>2\u003C\u002Fcode>, padahal pembulatan akan memberimu 3. Angka 33 di belakang koma itu tidak pernah sampai ke program.\u003C\u002Fp>\n\u003Cp>Operator \u003Ccode>%\u003C\u002Fcode> memberimu bagian yang tadi dibuang. \u003Ccode>247 % 3\u003C\u002Fcode> adalah \u003Ccode>1\u003C\u002Fcode>: angka 3 masuk ke 247 sebanyak delapan puluh dua kali, dan tersisa 1. Gabungkan keduanya dan tidak ada yang hilang, karena 82 * 3 + 1 adalah 247.\u003C\u002Fp>\n\u003Ch2 id=\"cast-sebelum-pembagian-bukan-sesudahnya\">Cast sebelum pembagian, bukan sesudahnya\u003C\u002Fh2>\n\u003Cp>Perbaikan yang paling kelihatan benar adalah meminta \u003Ccode>double\u003C\u002Fcode>. Ubah barisnya jadi seperti ini:\u003C\u002Fp>\n\u003Cp>\u003Ccode>double average = (double) (sum \u002F scores.length);\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cp>Baris ini lolos compile tanpa peringatan dan mencetak \u003Ccode>82.0\u003C\u002Fcode>. Bentuknya \u003Ccode>double\u003C\u002Fcode>, dan \u003Ccode>double\u003C\u002Fcode> terlihat presisi, tapi itu bukan rata-ratanya. Tanda kurung membuat pembagiannya berjalan lebih dulu, di \u003Ccode>int\u003C\u002Fcode>, dan hasilnya 82. Cast-nya baru kemudian melebarkan 82 menjadi 82.0. Kerusakannya sudah terjadi sebelum cast mendapat giliran.\u003C\u002Fp>\n\u003Cp>Cast-nya harus menempel pada operand: \u003Ccode>(double) sum \u002F scores.length\u003C\u002Fcode>. Cast mengikat lebih kuat daripada \u003Ccode>\u002F\u003C\u002Fcode>, jadi \u003Ccode>sum\u003C\u002Fcode> berubah jadi \u003Ccode>double\u003C\u002Fcode> lebih dulu. Dengan satu \u003Ccode>double\u003C\u002Fcode> di sisi kiri, Java melebarkan operand lainnya supaya cocok lalu membagi dalam floating point. Hasilnya \u003Ccode>82.33333333333333\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Berikut file yang sudah diperbaiki. Tipe \u003Ccode>average\u003C\u002Fcode> diganti, cast-nya dipindah ke \u003Ccode>sum\u003C\u002Fcode>, dan ada satu baris tambahan yang mencetak sisa pembagian tadi.\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">JAVA\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"%2F%2F%20Average.java%0Apublic%20class%20Average%20%7B%0A%20%20%20%20public%20static%20void%20main(String%5B%5D%20args)%20%7B%0A%20%20%20%20%20%20%20%20int%5B%5D%20scores%20%3D%20%7B80%2C%2075%2C%2092%7D%3B%0A%20%20%20%20%20%20%20%20int%20sum%20%3D%200%3B%0A%20%20%20%20%20%20%20%20for%20(int%20score%20%3A%20scores)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20sum%20%2B%3D%20score%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20double%20average%20%3D%20(double)%20sum%20%2F%20scores.length%3B%0A%20%20%20%20%20%20%20%20System.out.println(%22sum%3A%20%22%20%2B%20sum)%3B%0A%20%20%20%20%20%20%20%20System.out.println(%22average%3A%20%22%20%2B%20average)%3B%0A%20%20%20%20%20%20%20%20System.out.println(%22remainder%3A%20%22%20%2B%20sum%20%25%20scores.length)%3B%0A%20%20%20%20%7D%0A%7D\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Copy\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>\u002F\u002F Average.java\npublic class Average {\n    public static void main(String[] args) {\n        int[] scores = {80, 75, 92};\n        int sum = 0;\n        for (int score : scores) {\n            sum += score;\n        }\n        double average = (double) sum \u002F scores.length;\n        System.out.println(\"sum: \" + sum);\n        System.out.println(\"average: \" + average);\n        System.out.println(\"remainder: \" + sum % scores.length);\n    }\n}\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Jalankan dua perintah yang sama:\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">TEXT\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"sum%3A%20247%0Aaverage%3A%2082.33333333333333%0Aremainder%3A%201\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Copy\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>sum: 247\naverage: 82.33333333333333\nremainder: 1\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Ch2 id=\"prioritas-operator-dan-sisanya\">Prioritas operator dan sisanya\u003C\u002Fh2>\n\u003Cp>Perkalian, pembagian, dan sisa bagi mengikat lebih kuat daripada penjumlahan dan pengurangan. Jadi \u003Ccode>1 + 2 * 3\u003C\u002Fcode> adalah \u003Ccode>7\u003C\u002Fcode>, sementara \u003Ccode>(1 + 2) * 3\u003C\u002Fcode> adalah \u003Ccode>9\u003C\u002Fcode>. Tanda kurung mengubah operasi mana yang jalan lebih dulu. Bug cast tadi adalah kesalahan sejenis: urutan evaluasi Java yang menentukan jawabannya.\u003C\u002Fp>\n\u003Cp>Pembagian bulat muncul juga di luar rata-rata. \u003Ccode>10 \u002F 3\u003C\u002Fcode> adalah \u003Ccode>3\u003C\u002Fcode>. Ubah satu operand jadi \u003Ccode>double\u003C\u002Fcode> dan \u003Ccode>10.0 \u002F 3\u003C\u002Fcode> adalah \u003Ccode>3.3333333333333335\u003C\u002Fcode>. Satu \u003Ccode>.0\u003C\u002Fcode> di satu sisi mengubah bilangan bulat jadi pecahan panjang.\u003C\u002Fp>\n\u003Cp>Lihat lagi dua hasil panjang tadi. \u003Ccode>82.33333333333333\u003C\u002Fcode> dan \u003Ccode>3.3333333333333335\u003C\u002Fcode> tidak berakhir seperti yang kamu tulis di kertas. Dari situ muncul satu hal yang tidak diselesaikan artikel ini.\u003C\u002Fp>\n\u003Ch2 id=\"yang-tidak-dibahas-di-sini\">Yang tidak dibahas di sini\u003C\u002Fh2>\n\u003Cp>\u003Ccode>double\u003C\u002Fcode> tidak bisa menampung setiap desimal dengan tepat. Ia menyimpan pecahan biner, dan nilai seperti 0,1 tidak punya bentuk biner yang pas. Jumlahkan dua di antaranya dan celahnya kelihatan: \u003Ccode>0.1 + 0.2\u003C\u002Fcode> adalah \u003Ccode>0.30000000000000004\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Untuk uang, celah itu penting, dan Java punya \u003Ccode>BigDecimal\u003C\u002Fcode> untuk itu. Kita tidak memakainya di sini. Rata-rata nilai ujian bukan uang. Errornya jauh di belakang digit yang mungkin dipedulikan pembaca nilai, jadi \u003Ccode>double\u003C\u002Fcode> adalah alat yang tepat untuk program ini.\u003C\u002Fp>\n\u003Ch2 id=\"sebelum-artikel-berikutnya\">Sebelum artikel berikutnya\u003C\u002Fh2>\n\u003Cp>Ubah satu nilai supaya ketiganya berjumlah 246: pakai 80, 75, dan 91. Jalankan versi awal, lalu versi yang sudah diperbaiki. Ini yang saya ukur. Versi yang memotong pecahan mencetak \u003Ccode>82\u003C\u002Fcode>, dan versi ber-cast mencetak \u003Ccode>82.0\u003C\u002Fcode>. Keduanya sepakat, dan tidak ada jawaban yang tampak salah, karena 246 habis dibagi 3.\u003C\u002Fp>\n\u003Cp>Data yang habis dibagi menyembunyikan bug-nya. Tugasmu: jelaskan dengan kata-katamu sendiri kenapa bug itu kembali begitu jumlahnya tidak habis dibagi cacah data.\u003C\u002Fp>\n\u003Cp>Kalau satu hasil terlihat benar di satu input, input mana yang akan membuatnya salah?\u003C\u002Fp>\n","\u003Cul>\n\u003Cli>\u003Ccode>int \u002F int\u003C\u002Fcode> adalah pembagian bulat: pecahannya dipotong, bukan dibulatkan, jadi \u003Ccode>247 \u002F 3\u003C\u002Fcode> adalah \u003Ccode>82\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Ccode>%\u003C\u002Fcode> mengembalikan bagian yang dibuang pembagian: \u003Ccode>247 % 3\u003C\u002Fcode> adalah \u003Ccode>1\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>Melakukan cast pada hasilnya (\u003Ccode>(double) (sum \u002F count)\u003C\u002Fcode>) mencetak \u003Ccode>82.0\u003C\u002Fcode>, karena pembagiannya sudah selesai di \u003Ccode>int\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>Cast salah satu operand (\u003Ccode>(double) sum \u002F count\u003C\u002Fcode>) untuk membagi dalam floating point dan mendapat \u003Ccode>82.33333333333333\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Ccode>double\u003C\u002Fcode> tidak bisa menampung setiap desimal, karena \u003Ccode>0.1 + 0.2\u003C\u002Fcode> adalah \u003Ccode>0.30000000000000004\u003C\u002Fcode>, itu sebabnya uang memakai \u003Ccode>BigDecimal\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>Input uji yang habis dibagi, seperti 246 dibagi 3, menyembunyikan bug ini di kedua versi.\u003C\u002Fli>\n\u003C\u002Ful>\n",[174,179,199,216,230,249],{"id":74,"title":146,"title_id":75,"slug":76,"excerpt":147,"excerpt_id":77,"has_translation":12,"published_at":78,"reading_time":14,"hidden_from_listing":15,"tags":79,"thumbnail_image":21,"og_image":82,"series":175,"authors":176},{"id":84,"title":85,"title_id":86,"slug":87},[177],{"authors_id":178},{"id":109,"name":110,"slug":111,"role":112,"profile_picture":21},{"id":180,"title":181,"title_id":182,"slug":183,"excerpt":184,"excerpt_id":185,"has_translation":12,"published_at":78,"reading_time":186,"hidden_from_listing":15,"tags":187,"thumbnail_image":21,"og_image":190,"series":191,"authors":196},136,"Python Modules: the Import That Printed the Report","Modul Python: Import yang Mencetak Laporannya","python-modules","You pull one function out into its own file, import it, and the whole report runs again and eats your input. A module is a file, `import` runs it top to bottom, and one line decides which of the two jobs it is doing.","Kamu memindahkan satu fungsi ke file sendiri, meng-import-nya, dan seluruh laporan jalan lagi lalu memakan inputmu. Modul adalah file, `import` menjalankannya dari atas ke bawah, dan satu baris menentukan pekerjaan mana yang sedang dijalankan file itu.",7,[188,189],"python","modules","\u002Fog\u002Fpython-modules.png",{"id":192,"title":193,"title_id":194,"slug":195},18,"Working with Python Scripts","Menggunakan Script Python","python-pemrograman-dengan-script",[197],{"authors_id":198},{"id":109,"name":110,"slug":111,"role":112,"profile_picture":21},{"id":200,"title":201,"title_id":21,"slug":202,"excerpt":203,"excerpt_id":21,"has_translation":15,"published_at":204,"reading_time":137,"hidden_from_listing":15,"tags":205,"thumbnail_image":21,"og_image":210,"series":211,"authors":213},135,"Caching That Never Hits Costs More Than No Caching","caching-that-never-hits","Same model, same conversation, same token count, and a bill five times higher. The cause is a prefix that changes, a write premium nobody reads about, and a cost curve that grows faster than the loop.","2026-11-04T01:10:00.000Z",[206,207,208,209],"llm","ai-agent","cache","api","\u002Fog\u002Fcaching-that-never-hits.png",{"id":212,"title":35,"title_id":36,"slug":37},8,[214],{"authors_id":215},{"id":109,"name":110,"slug":111,"role":112,"profile_picture":21},{"id":217,"title":218,"title_id":21,"slug":219,"excerpt":220,"excerpt_id":21,"has_translation":15,"published_at":221,"reading_time":14,"hidden_from_listing":15,"tags":222,"thumbnail_image":21,"og_image":225,"series":226,"authors":227},134,"Your Stream Dies at 125 Seconds and Nothing in Your Code Says 125","your-stream-dies-at-125-seconds","Streaming moves the wait into a connection that outlives the request. Four layers sit between the model and the browser, their idle timeouts disagree, and the smallest one ends your stream.","2026-11-04T01:00:00.000Z",[223,224,207,209],"streaming","sse","\u002Fog\u002Fyour-stream-dies-at-125-seconds.png",{"id":212,"title":35,"title_id":36,"slug":37},[228],{"authors_id":229},{"id":109,"name":110,"slug":111,"role":112,"profile_picture":21},{"id":231,"title":232,"title_id":233,"slug":234,"excerpt":235,"excerpt_id":236,"has_translation":12,"published_at":237,"reading_time":121,"hidden_from_listing":15,"tags":238,"thumbnail_image":21,"og_image":240,"series":241,"authors":246},133,"Python Strings: the Badge That Only Worked for One Name","String Python: Badge yang Cuma Jalan untuk Satu Nama","python-strings","The badge script printed the right name for the person who wrote it and the wrong name for everybody else. Slicing counts characters, and a name is words.","Skrip badge mencetak nama yang benar untuk orang yang menulisnya dan nama yang salah untuk semua orang lain. Slicing menghitung karakter, sedangkan nama itu kata.","2026-10-28T13:00:00.000Z",[188,239],"string","\u002Fog\u002Fpython-strings.png",{"id":242,"title":243,"title_id":244,"slug":245},30,"Collections and Strings","Koleksi dan String","python-collections",[247],{"authors_id":248},{"id":109,"name":110,"slug":111,"role":112,"profile_picture":21},{"id":250,"title":251,"title_id":252,"slug":253,"excerpt":254,"excerpt_id":255,"has_translation":12,"published_at":256,"reading_time":121,"hidden_from_listing":15,"tags":257,"thumbnail_image":21,"og_image":259,"series":260,"authors":261},132,"Python Tuples: Why All Three Points Are the Same Point","Tuple Python: Kenapa Ketiga Titik Itu Titik yang Sama","python-tuples","Three points walk into a loop and come out identical. The list was never copied three times; the name was. A tuple makes that bug impossible.","Tiga titik masuk ke satu loop dan keluar identik. List-nya nggak pernah disalin tiga kali; yang disalin cuma namanya. Tuple membuat bug ini mustahil terjadi.","2026-10-28T12:00:00.000Z",[188,258],"tuple","\u002Fog\u002Fpython-tuples.png",{"id":242,"title":243,"title_id":244,"slug":245},[262],{"authors_id":263},{"id":109,"name":110,"slug":111,"role":112,"profile_picture":21},[265,269,272,275,278,281],{"text":266,"depth":267,"id":268},"Program yang mencetak 82",2,"program-yang-mencetak-82",{"text":270,"depth":267,"id":271},"Apa yang dilakukan \u002F kalau kedua sisinya int","apa-yang-dilakukan-kalau-kedua-sisinya-int",{"text":273,"depth":267,"id":274},"Cast sebelum pembagian, bukan sesudahnya","cast-sebelum-pembagian-bukan-sesudahnya",{"text":276,"depth":267,"id":277},"Prioritas operator dan sisanya","prioritas-operator-dan-sisanya",{"text":279,"depth":267,"id":280},"Yang tidak dibahas di sini","yang-tidak-dibahas-di-sini",{"text":282,"depth":267,"id":283},"Sebelum artikel berikutnya","sebelum-artikel-berikutnya",1793986940610]