Saya sedang membangun API ini, dan database akan menyimpan nilai-nilai yang mewakili salah satu dari yang berikut:
- persentase
- rata-rata
- menilai
Jujur saya tidak tahu bagaimana mewakili sesuatu yang kisarannya antara 0 dan 100% jumlahnya. Haruskah begitu
- 0,00 - 1,00
- 0,00 - 100,00
- alternatif lain yang saya tidak tahu
Apakah ada pilihan yang jelas untuk itu? Cara global untuk merepresentasikan sesuatu pada basis data dari 0 hingga 100%? Lebih jauh lagi, apa yang benar untuk tipe itu, mengapung atau desimal?
Terima kasih.
int
untuk mewakili ratusan atau dalam satuan Permyriad atau ‱.Jawaban:
Saya akan mengambil posisi sebaliknya.
FLOAT
adalah untuk angka perkiraan, seperti persentase, rata-rata, dll. Anda harus melakukan pemformatan saat Anda menampilkan nilai, baik dalam kode aplikasi atau menggunakanFORMAT()
fungsi MySQL.Jangan pernah menguji
float_value = 1.3
; ada banyak alasan mengapa itu akan gagal.DECIMAL
harus digunakan untuk nilai moneter.DECIMAL
menghindari pembulatan kedua saat nilai perlu dibulatkan ke dolar / sen / euro / dll. Akuntan tidak suka pecahan sen.Implementasi MySQL
DECIMAL
memungkinkan 65 digit signifikan;FLOAT
memberi sekitar 7 danDOUBLE
sekitar 16. 7 biasanya lebih dari cukup untuk sensor dan perhitungan ilmiah.Adapun "persentase" - Kadang-kadang saya telah menggunakan
TINYINT UNSIGNED
ketika saya ingin mengkonsumsi hanya 1 byte penyimpanan dan tidak perlu banyak presisi; kadang saya menggunakanFLOAT
(4 byte). Tidak ada tipe data yang disetel khusus untuk persentase. (Perhatikan juga, ituDECIMAL(2,0)
tidak dapat menahan nilainya100
, jadi secara teknis Anda perluDECIMAL(3,0)
.)Atau kadang-kadang saya menggunakan nilai
FLOAT
yang memegang antara 0 dan 1. Tapi kemudian saya harus memastikan untuk mengalikan dengan 100 sebelum menampilkan "persentase".Lebih
Ketiga "persentase, rata-rata, rata" bau seperti mengapung, jadi itu akan menjadi pilihan pertama saya.
Satu kriteria untuk memutuskan tipe data ... Berapa banyak salinan nilai yang akan ada?
Jika Anda memiliki tabel miliar baris dengan kolom untuk persentase, pertimbangkan bahwa
TINYINT
akan membutuhkan 1 byte (total 1GB), tetapiFLOAT
akan mengambil 4 byte (total 4GB). OTOH, sebagian besar aplikasi tidak memiliki banyak baris, jadi ini mungkin tidak relevan.Sebagai aturan 'umum', nilai "tepat" harus menggunakan beberapa bentuk
INT
atauDECIMAL
. Hal-hal yang tidak tepat (perhitungan ilmiah, akar kuadrat, pembagian, dll) harus menggunakanFLOAT
(atauDOUBLE
).Selanjutnya, format output biasanya harus dibiarkan ke ujung depan aplikasi. Artinya, meskipun "rata-rata" dapat menghitung menjadi "14.6666666 ...", layar akan menampilkan sesuatu seperti "14.7"; ini lebih bersahabat dengan manusia. Sementara itu, Anda memiliki nilai dasar untuk nanti memutuskan bahwa "15" atau "14,667" adalah format output yang disukai.
Rentang "0,00 - 100,00" dapat dilakukan dengan
FLOAT
dan menggunakan pemformatan output atau denganDECIMAL(5,2)
(3 byte) dengan pra-penentuan bahwa Anda akan selalu menginginkan ketepatan yang ditunjukkan .sumber
Saya biasanya merekomendasikan untuk tidak menggunakan
float
. Angka titik apung memang mewakili angka dalam basis-2, yang menyebabkan beberapa angka (tepat) bulat dalam operasi atau perbandingan, karena angka-angka itu tidak dapat secara akurat disimpan dalam basis-2. Ini dapat menyebabkan perilaku mengejutkan.Perhatikan contoh berikut :
Basis-2 perbandingan angka
1.3
gagal. Ini rumit.Sebagai perbandingan, desimal memberikan representasi akurat dari angka hingga dalam kisarannya. Jika Anda mengubah
float
kedecimal(2, 1)
dalam contoh di atas, Anda memang mendapatkan hasil yang diharapkan.sumber
Perbedaan antara float dan desimal adalah presisi. Desimal dapat 100% secara akurat mewakili angka apa pun dalam ketepatan format desimal, sedangkan Float, tidak dapat secara akurat mewakili semua angka.
Gunakan Desimal untuk misalnya nilai terkait keuangan dan gunakan float untuk misalnya nilai terkait grafis
sumber
Saya sarankan menggunakan
decimal(5,2)
jika Anda akan menyimpannya dengan cara yang sama Anda akan menampilkannya karenadecimal
untuk menjaga presisi yang tepat. (Lihat https://dev.mysql.com/doc/refman/8.0/en/fixed-point-types.html )( https://dev.mysql.com/doc/refman/8.0/id/floating-point-types.html )
https://dev.mysql.com/doc/refman/8.0/id/problems-with-float.html
sumber
Desimal: Dalam hal aplikasi keuangan, lebih baik menggunakan tipe Desimal karena memberi Anda tingkat akurasi yang tinggi dan mudah untuk menghindari kesalahan pembulatan
Ganda: Jenis Ganda mungkin merupakan tipe data yang paling sering digunakan untuk nilai riil, kecuali penanganan uang.
Float: Ini digunakan sebagian besar di perpustakaan grafis karena tuntutan yang sangat tinggi untuk kekuatan pemrosesan, juga digunakan situasi yang dapat menanggung kesalahan pembulatan.
Referensi: http://net-informations.com/q/faq/float.html
sumber
Desimal melakukan persis apa yang seharusnya dilakukan pada kasus ini, ia memotong sisanya, sehingga kehilangan 1/3 bagian.
Jadi untuk jumlah, desimal lebih baik, tetapi untuk divisi, float lebih baik, sampai titik tertentu, tentu saja. Maksud saya, menggunakan DECIMAL tidak akan memberi Anda "aritmatika gagal-bukti" dengan cara apa pun.
Saya harap ini akan membantu.
sumber
Dalam tsql: Float, 0,0 simpan sebagai 0 dan tidak perlu mendefinisikan setelah angka titik desimal, misalnya Anda tidak perlu menulis Float (4,2). Desimal, 0,0 simpan sebagai 0,0 dan memiliki opsi untuk mendefinisikan seperti desimal (4,2), saya sarankan 0,00-1,00, dengan melakukan ini, Anda dapat menghitung nilai persen tanpa kalikan dengan 100, dan jika Anda melaporkan kemudian mengatur tipe data kolom yang persen seperti MS Excel dan tampilan platform lainnya suka
0.5 -> 50%
.sumber