Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Halaman ini mencantumkan beberapa masalah umum yang dapat terjadi ketika Anda melakukan operasi pada jenis data intrinsik.
Ekspresi Floating-Point Jangan Bandingkan sebagai Sama
Saat Anda bekerja dengan angka floating-point (Tipe Data Tunggal dan Tipe Data Ganda), ingatlah bahwa angka tersebut disimpan sebagai pecahan biner. Ini berarti mereka tidak dapat memegang representasi yang tepat dari jumlah apa pun yang bukan pecahan biner (dari bentuk k / (2 ^ n) di mana k dan n adalah bilangan bulat). Misalnya, 0,5 (= 1/2) dan 0,3125 (= 5/16) dapat ditahan sebagai nilai yang tepat, sedangkan 0,2 (= 1/5) dan 0,3 (= 3/10) hanya dapat berupa perkiraan.
Karena impresi ini, Anda tidak dapat mengandalkan hasil yang tepat ketika Anda beroperasi pada nilai floating-point. Secara khusus, dua nilai yang secara teoritis sama mungkin memiliki representasi yang sedikit berbeda.
| Untuk membandingkan jumlah floating-point |
|---|
| 1. Hitung nilai absolut perbedaannya dengan menggunakan Abs metode Math kelas di System namespace. 2. Tentukan perbedaan maksimum yang dapat diterima, sehingga Anda dapat menganggap dua jumlah tersebut sama untuk tujuan praktis jika perbedaannya tidak lebih besar. 3. Bandingkan nilai absolut perbedaan dengan perbedaan yang dapat diterima. |
Contoh berikut menunjukkan perbandingan dua Double nilai yang salah dan benar.
Dim oneThird As Double = 1.0 / 3.0
Dim pointThrees As Double = 0.333333333333333
' The following comparison does not indicate equality.
Dim exactlyEqual As Boolean = (oneThird = pointThrees)
' The following comparison indicates equality.
Dim closeEnough As Double = 0.000000000000001
Dim absoluteDifference As Double = Math.Abs(oneThird - pointThrees)
Dim practicallyEqual As Boolean = (absoluteDifference < closeEnough)
MsgBox("1.0 / 3.0 is represented as " & oneThird.ToString("G17") &
vbCrLf & "0.333333333333333 is represented as " &
pointThrees.ToString("G17") &
vbCrLf & "Exact comparison generates " & CStr(exactlyEqual) &
vbCrLf & "Acceptable difference comparison generates " &
CStr(practicallyEqual))
Contoh sebelumnya menggunakan ToString metode Double struktur sehingga dapat menentukan presisi yang lebih baik daripada yang CStr digunakan kata kunci. Defaultnya adalah 15 digit, tetapi format "G17" memperluasnya menjadi 17 digit.
Operator mod tidak mengembalikan hasil yang akurat
Karena impresi penyimpanan floating-point, Operator Mod dapat mengembalikan hasil yang tidak terduga ketika setidaknya salah satu operand adalah floating-point.
Tipe Data Desimal tidak menggunakan representasi floating-point. Banyak angka yang tidak ada SingleDouble dan persis di Decimal (misalnya 0,2 dan 0,3). Meskipun aritmatika lebih lambat daripada Decimal di floating-point, mungkin sepadan dengan penurunan performa untuk mencapai presisi yang lebih baik.
| Untuk menemukan sisa bilangan bulat dari jumlah floating-point |
|---|
1. Deklarasikan variabel sebagai Decimal.2. Gunakan karakter D jenis harfiah untuk memaksa literal ke Decimal, jika nilainya terlalu besar untuk Long jenis data. |
Contoh berikut menunjukkan potensi impresi operand floating-point.
Dim two As Double = 2.0
Dim zeroPointTwo As Double = 0.2
Dim quotient As Double = two / zeroPointTwo
Dim doubleRemainder As Double = two Mod zeroPointTwo
MsgBox("2.0 is represented as " & two.ToString("G17") &
vbCrLf & "0.2 is represented as " & zeroPointTwo.ToString("G17") &
vbCrLf & "2.0 / 0.2 generates " & quotient.ToString("G17") &
vbCrLf & "2.0 Mod 0.2 generates " &
doubleRemainder.ToString("G17"))
Dim decimalRemainder As Decimal = 2D Mod 0.2D
MsgBox("2.0D Mod 0.2D generates " & CStr(decimalRemainder))
Contoh sebelumnya menggunakan ToString metode Double struktur sehingga dapat menentukan presisi yang lebih baik daripada yang CStr digunakan kata kunci. Defaultnya adalah 15 digit, tetapi format "G17" memperluasnya menjadi 17 digit.
Karena zeroPointTwo adalah Double, nilainya untuk 0,2 adalah pecahan biner yang berulang tanpa batas dengan nilai tersimpan 0,2000000000000000001. Membabungkan 2,0 dengan hasil kuantitas ini 9,99999999999999995 dengan sisa 0,1999999999991.
Dalam ekspresi untuk decimalRemainder, karakter D jenis harfiah memaksa kedua operand ke Decimal, dan 0,2 memiliki representasi yang tepat.
Mod Oleh karena itu operator menghasilkan sisa yang diharapkan 0,0.
Perhatikan bahwa tidak cukup untuk menyatakan decimalRemainder sebagai Decimal. Anda juga harus memaksa literal untuk Decimal, atau mereka menggunakan Double secara default dan decimalRemainder menerima nilai yang tidak akurat yang sama dengan doubleRemainder.
Tipe Boolean Tidak Dikonversi ke Tipe Numerik Secara Akurat
Nilai Tipe Data Boolean tidak disimpan sebagai angka, dan nilai yang disimpan tidak dimaksudkan untuk setara dengan angka. Untuk kompatibilitas dengan versi sebelumnya, Visual Basic menyediakan kata kunci konversi (Operator CType, CBool, CInt, dan sebagainya) untuk mengonversi antara Boolean jenis numerik dan . Namun, bahasa lain terkadang melakukan konversi ini secara berbeda, seperti halnya metode .NET Framework.
Anda tidak boleh menulis kode yang bergantung pada nilai numerik yang setara untuk True dan False. Jika memungkinkan, Anda harus membatasi penggunaan Boolean variabel ke nilai logis yang dirancang. Jika Anda harus mencampur Boolean dan nilai numerik, pastikan Anda memahami metode konversi yang Anda pilih.
Konversi di Visual Basic
Saat Anda menggunakan CType kata kunci konversi atau CBool untuk mengonversi jenis data numerik menjadi Boolean, 0 menjadi False dan semua nilai lainnya menjadi True. Saat Anda mengonversi Boolean nilai ke jenis numerik dengan menggunakan kata kunci konversi, False menjadi 0 dan True menjadi -1.
Konversi dalam Kerangka Kerja
Metode ToInt32Convert kelas di System namespace dikonversi True ke +1.
Jika Anda harus mengonversi Boolean nilai ke jenis data numerik, berhati-hatilah dengan metode konversi mana yang Anda gunakan.
Literal Karakter Menghasilkan Kesalahan Pengkompilasi
Dengan tidak adanya karakter jenis apa pun, Visual Basic mengasumsikan jenis data default untuk literal. Jenis default untuk karakter literal — yang diapit dalam tanda kutip (" ") — adalah String.
Tipe String data tidak melebar ke Tipe Data Karakter. Ini berarti bahwa jika Anda ingin menetapkan literal ke Char variabel, Anda harus membuat konversi yang mempersempit atau memaksa literal ke jenisnya Char .
| Untuk membuat Char literal untuk ditetapkan ke variabel atau konstanta |
|---|
1. Deklarasikan variabel atau konstanta sebagai Char.2. Sertakan nilai karakter dalam tanda kutip ( " ").3. Ikuti tanda kutip ganda penutup dengan karakter C jenis harfiah untuk memaksa literal ke Char. Ini diperlukan jika sakelar pemeriksaan jenis (Pernyataan Ketat Opsi) adalah On, dan diinginkan dalam hal apa pun. |
Contoh berikut menunjukkan penugasan yang tidak berhasil dan berhasil dari literal ke Char variabel.
Dim charVar As Char
' The following statement attempts to convert a String literal to Char.
' Because Option Strict is On, it generates a compiler error.
charVar = "Z"
' The following statement succeeds because it specifies a Char literal.
charVar = "Z"c
' The following statement succeeds because it converts String to Char.
charVar = CChar("Z")
Selalu ada risiko dalam menggunakan konversi yang mempersempit, karena dapat gagal pada waktu proses. Misalnya, konversi dari String ke Char dapat gagal jika String nilai berisi lebih dari satu karakter. Oleh karena itu, lebih baik pemrograman untuk menggunakan C karakter jenis.
Konversi String Gagal pada Run Time
Jenis Data String berpartisipasi dalam sangat sedikit konversi yang melebar.
String hanya melebar ke dirinya sendiri dan Object, dan hanya Char dan Char() (array Char ) melebar ke String. Ini karena String variabel dan konstanta dapat berisi nilai yang tidak dapat dimuat tipe data lainnya.
Ketika sakelar pemeriksaan jenis (Pernyataan Ketat Opsi) adalah On, pengkompilasi melarang semua konversi penyempitan implisit. Ini termasuk yang melibatkan String. Kode Anda masih dapat menggunakan kata kunci konversi seperti CStr dan Operator CType, yang mengarahkan .NET Framework untuk mencoba konversi.
Nota
Kesalahan konversi-penyempitan ditekan untuk konversi dari elemen dalam For Each…Next koleksi ke variabel kontrol perulangan. Untuk informasi dan contoh selengkapnya, lihat bagian "Mempersempit Konversi" di Untuk Setiap... Pernyataan Berikutnya.
Mempersempit Perlindungan Konversi
Kerugian dari mempersempit konversi adalah bahwa mereka dapat gagal pada waktu proses. Misalnya, jika String variabel berisi apa pun selain "True" atau "False," variabel tersebut tidak dapat dikonversi ke Boolean. Jika berisi karakter tanda baca, konversi ke jenis numerik gagal. Kecuali Anda tahu bahwa variabel Anda String selalu menyimpan nilai yang dapat diterima oleh jenis tujuan, Anda tidak boleh mencoba konversi.
Jika Anda harus mengonversi dari String ke jenis data lain, prosedur paling aman adalah mengapit konversi yang dicoba di Coba... Menangkap... Pernyataan Terakhir. Ini memungkinkan Anda menangani kegagalan run-time.
Array Karakter
Satu Char dan array Char elemen keduanya melebar ke String. Namun, String tidak melebar ke Char(). Untuk mengonversi String nilai menjadi Char array, Anda dapat menggunakan ToCharArray metode System.String kelas .
Nilai Yang Tidak Berarti
Secara umum, String nilai tidak bermakna dalam jenis data lain, dan konversi sangat buatan dan berbahaya. Jika memungkinkan, Anda harus membatasi penggunaan String variabel ke urutan karakter yang dirancang. Anda tidak boleh menulis kode yang bergantung pada nilai yang setara dalam jenis lain.