Bab 4: Tipe-Tipe Data dan Operator
4.3 Floating Point
Type floating point dapat digunakan untuk merepresentasikan bilangan pecahan misalnya 1.5 dan -0.001. Terdapat dua type yang bisa kita pilih yaitu float dan double. Jika terdapat literal angka yang mengandung bilangan fraksional maka type literal tersebut secara default adalah double.
Type Jarak (positif dan negatif) Bit / Byte yang Digunakan float 1.5 * 10-45 sampai 3.4 * 1038 32 bit / 4 byte
double 5 * 10-324 sampai 1.7 * 10308 64 bit / 8 byte
Batas terkecil di tabel tersebut maksudnya adalah fraksional terkecil yang bisa direpresentasikan. Tentu saja 0 juga bisa direpresentasikan oleh floating point.
Selain menuliskan literal floating point dalam bentuk biasanya, kita juga bisa menuliskannya dengan format mantisa + exponen. Untuk format tersebut karakter e atau
E digunakan. Contohnya 1.01e2 sama dengan 1.01 * 102 atau 101, dan 5e1 sama dengan
5 * 101 atau 50. Tidak boleh ada pemisah antara mantisa, e, dan eksponennya.
Hal-hal yang telah kita bahas sebelumnya di bab ini yang berhubungan dengan inte berlaku juga untuk floating point. Mari kita pakai floating point dalam program berikut:
[program lengkap]
using Syst em ; class Float ingPoint { st at ic v oid Main( ) { double pan j an g = 100. 4; double leb ar = 32. 3 ; double anak = 5;
Console. Wr it eLine( “ Luas t anah: ” ) ; Console. Wr it eLine( panj ang * lebar ) ;
Console. Wr it eLine( “ Luas t anah unt uk t iap anak : ” ) ; Console. Wr it eLine( panj ang * lebar / anak ) ;
} }
[/program lengkap]
Outputnya adalah sebagai berikut:
[console]
Luas t anah: 3 2 4 2 . 9 2
Luas t anah unt uk t iap anak : 6 4 8 . 5 8 4
[/console]
Ada beberapa hal baru yang bisa kita ketahui. Pertama, jika kedua operand dari operator binary adalah floating point, maka hasilnya juga adalah floating point. Kedua, Method WriteLine() dapat menerima floating point sebagai argumentnya (begitu juga dengan method Write()).
4.4 decimal
Type floating point memiliki beberapa kelemahan dalam ketepatannya yang berhubungan dengan cara kerja internalnya. Kadang-kadang kesalahan dapat terjadi, contohnya ada di program berikut:
[program lengkap]
/ / Program 4.6 - Mem per agak an k elem ahan float ing point using Syst em ;
class Kelem ahanFloat ing {
st at ic v oid Main( ) {
Console. Wr it eLine( 1. 1 - 1. 09) ; / / sehar usny a 0. 01 Console. Wr it eLine( 2. 1 - 2. 09) ; / / sehar usny a 0. 01
Console. Wr it eLine( 1. 1 + 0. 1) ; / / sehar usny a 1. 2 Console. Wr it eLine( 1. 1 + 0. 00000000000000001) ; / / sehar usny a 1 . 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 } } [/program lengkap]
Hasilnya tidak seperti yang kita harapkan, perhatikan baris ke 2 dan 4:
[console] 0.01 0. 0100000000000002 1 . 2 1 . 1 [/console]
Kesalahan-kesalahan tersebut mungkin begitu kecil dan biasanya dapat ditoleransi, namun bagaimana kalau program yang kita buat berhubungan dengan perhitungan uang? Tentunya kesalahan sekecil apapun tidak dapat diterima.
Disitulah type decimal berperan. Type ini besarnya 128 bit atau 16 byte, dan dapat merepresentasikan positif/negatif 1 * 10-28 sampai 7.9 * 1028. Jaraknya jauh lebih kecil dari float dan double, namun tidak akan ada pembulatan dan kesalahan-kesalahan perhitungan lain yang ada di type floating point. Untuk menulis literal yang typenya
decimal, kita harus membubuhi m atau M di belakang angkanya. Program 4.6 akan kita tulis ulang menggunakan decimal:
[program lengkap]
/ / Pr ogr am 4.7 - Menggunak an decim al using Syst em ;
class Menggunak anDecim al {
st at ic v oid Main( ) {
Console. Wr it eLine( 1. 1m - 1 . 0 9 m ) ; / / sehar usny a 0 . 0 1 Console. Wr it eLine( 2. 1m - 2 . 0 9 m ) ; / / sehar usny a 0 . 0 1 Console. Wr it eLine( 1. 1m + 0. 1m ) ; / / sehar usny a 1. 2 Console. Wr it eLine( 1. 1m + 0. 00000000000000001m ) ; / / sehar usny a 1 . 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 } } [/program lengkap] Hasilnya sempurna: [console] 0.01 0.01
1 . 2
1 . 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
[/console]
[latihan mini]
• Sebutkan 2 type floating point yang ada di C#!
• Sebutkan keunggulan dan kelemahan type decimal dibandingkan dengan float atau
double! • float dan double.
• Type decimal memiliki ketepatan yang sangat tinggi dan tidak akan ada pembulatan dalam operasi yang melibatkan type decimal. Di lain pihak type decimal membutuhkan 128 bit, jangkauannya lebih rendah, dan operasi yang melibatkan type decimal membutuhkan waktu yang lebih lama.
[/latihan mini]
4.5 char
char digunakan untuk merepresentasikan 1 karakter. C# tidak menggunakan standar ASCII tetapi menggunakan Unicode. Unicode besarnya 16 bit dan mendefinisikan semua karakter yang ada di berbagai bahasa manusia beserta macam- macam simbol. Untuk menulis literal karakter, kita harus mengurung karakternya dengan ‘ dan ‘. Lihat contoh berikut: [program lengkap] / / Program 4.8 - Kar ak t er using Syst em ; class Kar ak t er { st at ic v oid Main( ) { char h = ‘h’; char a = ‘a’; char l = ‘l’; char o = ‘o’; Console. Wr it e( h) ; Console. Wr it e( a) ; Console. Wr it e( l) ; Console. Wr it e( o) ; Console. Wr it eLine( ‘! ’) ; } } [/program lengkap] Ini outputnya: [console]
halo!
[/console]
Baris baru (new line), huruf- huruf arab, dan banyak karakter lain secara umum cukup sulit untuk ditulis secara normal. Untuk menyelesaikan masalah tersebut kita bisa menggunakan escape seque nce heksadesimal atau escape sequence unicode.
Cara menggunakan escape sequence heksadesimal adalah menuliskan \x diikuti kode Unicodenya dalam heksadesimal. Contohnya karakter a memiliki kode Unicode 97
atau 0x61. Ini berarti kita bisa menulis ‘\x61’ sebagai alternatif dari ‘a’.
Escape sequence Unicode dimulai dengan \u atau \U dan ditulis menggunakan salah satu format berikut:
[format] \u[angka][angka][angka][angka] \U[angka][angka][angka][angka] \u[angka][angka][angka][angka][angka][angka][angka][angka] \U[angka][angka][angka][angka][angka][angka][angka][angka] [/format]
Contohnya adalah ‘\u0061’ yang sama artinya dengan ‘\x61’ dan ‘a’.
Escape sequence Unicode dapat digunakan untuk menuliskan identifier, sedangkan escape sequence heksadesimal tidak. Mekanisme “keyword sebagai identifier” juga dapat dilaksanakan dengan menggunakan escape sequence Unicode, seperti dalam kutipan berikut:
[kutipan program]
cl ass cl\ u0061ss / / cl\ u0061ss sam a ar t iny a dengan dengan @class
[/kutipan program]
[catatan]
Yang dimaksud angka dalam format penulisan escape sequence Unicode (dan heksadesimal) juga mencakup abjad a-f dan A-F.
[/catatan]
Beberapa karakter malah memiliki escape sequence spesial, seperti ditunjukkan dalam tabel berikut:
Escape Sequence Kode Unicode Arti
\ a 0x7 atau 7 Alert (membunyikan suara)
\ b 0x8 atau 8 Backspace
\ f 0xc atau 12 Form Feed
\ n 0xa atau 10 New line (baris baru)
\ r 0xd atau 13 Kembali ke awal baris
\ t 0x9 atau 9 Tabulasi horizontal
\ v 0xb atau 11 Tabulasi vertikal
\ ’ 0x27 atau 39 Tanda kutip
\ ” 0x22 atau 34 Tanda kutip ganda
\ \ 0x5c atau 92 Backslash (garis miring kiri) Penggunaannya ada di program berikut:
[program lengkap]
/ / Program 4.9 - Escape sequ en ce using Syst em ; class EscapeSequ en ce { st at ic v oid Main( ) { char t andaPet ik = ‘\ ”’; char t andaKut ip = ‘\ ’’; char bar isBar u = ’\ n’; Console. Wr it e( t andaPet ik ) ; Console. Wr it e( “ halo. . . ” ) ; Console. Wr it e( t andaPet ik ) ; Console. Wr it e( bar isBar u) ; Console. Wr it e( t andaKut ip) ; Console. Wr it e( “ halo. . . ” ) ; Console. Wr it e( t andaKut ip) ; }
}
[/program lengkap]
Outputnya adalah sebagai berikut:
[console]
" halo. . . " 'halo. . . '
[/console]
Daftar karakter-karakter Unicode beserta kodenya ada di [[x]].