SORU
15 Aralık 2011, PERŞEMBE


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.3331.257...

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
15 Aralık 2011, PERŞEMBE


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Edgar flores

    Edgar flores

    7 HAZİRAN 2006
  • hotstrikegently

    hotstrikegen

    26 AĞUSTOS 2011
  • Matthew Pearce

    Matthew Pear

    9 AĞUSTOS 2009