Terkadang, tipe data Activerecord membingungkan saya. Err, sering. Salah satu pertanyaan abadi saya adalah, untuk kasus tertentu,
Haruskah saya menggunakan
:decimal
atau:float
?
Saya sering menemukan tautan ini, ActiveRecord:: desimal vs: float? , tetapi jawabannya tidak cukup jelas bagi saya untuk memastikan:
Saya telah melihat banyak utas di mana orang merekomendasikan flat out untuk tidak pernah menggunakan float dan selalu menggunakan desimal. Saya juga melihat saran oleh beberapa orang untuk menggunakan float hanya untuk aplikasi ilmiah.
Berikut adalah beberapa contoh kasus:
- Geolocation / lintang / bujur:
-45.756688
,120.5777777
, ... - Rasio / persentase:
0.9
,1.25
,1.333
,1.4143
, ...
Saya telah menggunakan :decimal
di masa lalu, tetapi saya menemukan berurusan dengan BigDecimal
benda - benda di Ruby tidak perlu canggung dibandingkan dengan pelampung. Saya juga tahu saya bisa menggunakan :integer
untuk mewakili uang / sen, misalnya, tetapi tidak cukup cocok untuk kasus lain, misalnya ketika jumlah di mana presisi dapat berubah dari waktu ke waktu.
- Apa kelebihan / kekurangan menggunakan masing-masing?
- Apa aturan praktis yang baik untuk mengetahui tipe mana yang digunakan?
sumber
+1.43*2^10
bukan+1.43*10^2
?Dalam Rails 3.2.18,: desimal berubah menjadi: integer saat menggunakan SQLServer, tetapi berfungsi baik dalam SQLite. Beralih ke: float memecahkan masalah ini untuk kami.
Pelajaran yang dipetik adalah "selalu gunakan database pengembangan dan penyebaran yang homogen!"
sumber
Di Rails 4.1.0, saya menghadapi masalah dengan menyimpan lintang dan bujur ke basis data MySql. Itu tidak dapat menyimpan nomor fraksi besar dengan tipe data float. Dan saya mengubah tipe data menjadi desimal dan berfungsi untuk saya.
sumber
decimal(13,9)
cukup untuk garis lintang dan bujur. @ScottW: Saya tidak ingat, tetapi jika Postgres menggunakan IEEE float, itu hanya "berfungsi dengan baik" karena Anda belum mengalami masalah ... BELUM. Ini adalah format yang tidak memadai untuk lintang dan bujur. Yo akhirnya akan memiliki kesalahan dalam digit paling tidak signifikan.