Vs ActiveRecord Ondalık şamandıra
Bazen Activerecord veri türleri beni karıştırmayın. Err, sık sık. Benim ebedi sorulardan biri, belirli bir dava için
:decimal
:float
kullanmalıyım?
Genellikle bu bağlantı rastlamak ettikActiveRecord: :decimal vs :float?cevaplar beni emin olmak için çok belirgin değil , ama:
İnsanlar asla kullanmak için düz dışarı tavsiye birçok konuları gördüm şamandıra ve her zaman ondalık kullanın. Ayrıca bazı öneriler gördüm insanlar bilimsel uygulamalar için şamandıra sadece kullanmak için.
İşte bazı örnek davalar:
- Coğrafi konum/enlem/boylam:
-45.756688
,120.5777777
, ... - Oranı/yüzde: , , *,
1.4143
, *1.333
1.25
7...
Geçmişte :decimal
kullandım fakat BigDecimal
ile Ruby nesneleri keyfine göre gereksiz yere garipti karşı karşıya kaldım. Ben de :integer
para/sent göstermek için kullanın edebilirim, örneğin, ama oldukça hassas zamanla değişebilir miktarlarda örneğin diğer durumlar için uygun değil.
- Avantajları her kullanmanın dezavantajları nelerdir?
- Başparmak iyi bir kural kullanmak için hangi bilmek ne olurdu?
CEVAP
CompSci hocam asla para için yüzer kullanmak için söylediğini hatırlıyorum.
Bunun sebebi ne ikili biçimde IEEE specification defines floats. Temelde, işaret, kesir ve üs bir Şamandıra temsil etmek için saklar. İkili ( 1.43*10^2
gibi bir şey) için bilimsel bir gösterim gibi. Bu nedenle, imkansız Dubası kesirler ve ondalık sayılar tam olarak saklamak için.
Ondalık biçimi var. Eğer bunu yaparsanız:
irb:001:0> "%.47f" % (1.0/10)
=> "0.10000000000000000555111512312578270211815834045" # not "0.1"!
yaparsan eğer oysa
irb:002:0> (1.0/10).to_s
=> "0.1" # the interprer rounds the number for you
Eğer küçük kesirler ile ilgili ise, bileşik ilgi, ya da belki coğrafi konum gibi, ondalık biçiminde 1.0/10
0.1 tam olarak ne olduğundan Ondalık biçim tavsiye ederim çok çok.
Ancak, daha az doğru olmasına rağmen, yüzer daha hızlı işlenir unutulmamalıdır. İşte bir kriter:
require "benchmark"
require "bigdecimal"
d = BigDecimal.new(3)
f = Float(3)
time_decimal = Benchmark.measure{ (1..10000000).each { |i| d * d } }
time_float = Benchmark.measure{ (1..10000000).each { |i| f * f } }
puts time_decimal
#=> 6.770960 seconds
puts time_float
#=> 0.988070 seconds
Cevap
Kullanınyüzerhassas hakkında çok fazla umurumda değil. Örneğin, bazı bilimsel simülasyonları ve Hesaplamalar sadece 3 veya 4 önemli basamak lazım. Bu hız, doğruluk takas yararlıdır. Hassas çok hıza gerek olmadığı için, yüzer kullanırlar.
Kullanınondalıkhassas ve sayı (bileşik çıkarları ve para ile ilgili şeyler gibi) düzeltmek için özetlemek için gereken numaraları ile ilgileniyor. Unutmayın: eğer hassas gerekiyorsa, o zaman her zaman ondalık kullanmalısınız.
şamandıra ve ondalık veri türü arasınd...
Muhasebe Uygulama Tutarı Şamandıra vey...
Sayısal,şamandıra arasındaki fark ve s...
Nasıl jruby iki ondalık basamak için b...
Bir şamandıra yalnızca iki ondalık bas...