database küsürat mantığı?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
myalcin
Üye
Mesajlar: 63
Kayıt: 11 Mar 2008 03:45

database küsürat mantığı?

Mesaj gönderen myalcin »

Merhaba,
Veritabanımdaki float bir alana küsüratı yuvarlatarak son iki rakamını alıp kaydetmesini istiyorum şöyle bir şey denedim

Kod: Tümünü seç

function RoundToNearest(AValue: Extended; ADigit: Integer): Extended;
var
  i, f, n: Extended;
begin
  i := Int(AValue);
  f := Frac(AValue);

  if (f = 0) then
    Result := AValue
  else
  begin
    f := f * Power(10, ADigit);
    i := Int(f);

    if ((i + 1) - f) < (f - i) then
      n := i + 1
    else
      n := i;

    if n = Power(10, ADigit) then
      Result := Int(AValue) + 1
    else
      Result := Int(AValue) + (n / Power(10, ADigit));
  end;
end;
IBQuery1TUTAR.AsFloat:=RoundToNearest(tutar,2);

mesela ben bunu string olarak göstertiyorum = 13,67 gibi
ama veritabanına kaydolunca 13,6777777777777 diye gidiyor.
bunu nasıl düzeltebilirim .
Teşekkürler.
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Re: database küsürat mantığı?

Mesaj gönderen undefined »

Onun öyle gözükmesi tamamen floating point tiplerin hafızada tutulma şeklinde ileri geliyor. DB'de öyle gözükmesinin bir önemi yok, önemli olan senin kullanıcıya nasıl formatlatıp gösterdiğin. Parasal tipler için delphi tarafından Currency, DB tarafından ise money tipini veya decimal(18,2) gibi bir tip kullanabilirsin. Bu DB'ye bağlı. Double, extended kullanmaktan kaçın, bu tiplerde floating point hataları oluşabiliyor.
Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 01 Eki 2007 12:02
Konum: Ankara

Re: database küsürat mantığı?

Mesaj gönderen Battosai »

Sayıları yuvarlama yerine Formatlasan daha kolay olur aslında yani FormatFloat('#,##0.00,sayi') şeklinde parasal olarak gösterirken bu fonksiyon sayısal değeri kendisi yuvarlıyor.undefined dediği hata oluşması meselesi büyük küsüratlarda oluşabilecek hatalardan bahsediyor heral...gerçi ben hep double kullanırım delphi tarafında bir sorunla karşılaşmadım şimdiye kadar... kullanıcılarda extrem paralarla uğraşmayacaklarına göre sorun olmaz yani...Firebird decimal için nasıl tavır takınıyor bilmiyorum MySQL de (10,2) şeklinde tanımlanmış bir alan küsürat kısmı 2 haneden fazla ise yuvarlanarak iki hane veya tek hane ise yuvarlanmadan yazılıyor.currency alan destekleyen tüm veritabanları için currency tanımlamak en iyi yoldur böylece küsurat sapmalarından kurtulursun....double olarak tanımlanmış bir değişken ile parasal hesaplar yapıyorsan sayıların yuvarlanmadan 2 haneli küsuratını almalısın gerçekçi sonuç almak için, yoksa büyük toplamlarda yuvarlamadan kaynaklanan önemli sapmalar oluşacaktır.
myalcin
Üye
Mesajlar: 63
Kayıt: 11 Mar 2008 03:45

Re: database küsürat mantığı?

Mesaj gönderen myalcin »

şöyle birşey yaptım
IBQuery1TUTAR.AsFloat:=StrToFloat(FormatFloat('0.00', pay)); //pay = 100 / 3

veritabanına kaydettim.
ve veritabanındaki sonuç = 33,3300018310547

veritabanına 33,33 gibi kaydedemez miyim acaba ?

ayrıca yanıtlarınız için teşekkürler.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: database küsürat mantığı?

Mesaj gönderen aslangeri »

s.a.
veritabanındaki alanın tipini değiştirirsen olur.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
myalcin
Üye
Mesajlar: 63
Kayıt: 11 Mar 2008 03:45

Re: database küsürat mantığı?

Mesaj gönderen myalcin »

merhaba,
Firebird'de "currency" alan yok bildiğim kadarıyla.
Eğer string yaparsam "select sum(tutar)" olayını nasıl yapacağım.
teşk.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: database küsürat mantığı?

Mesaj gönderen aslangeri »

s.a.
fb de parasal alanlar için double precision kullanılır genelde.
ancak bildiğim kadarı ile ondada küsürat sizi sıkıntıya sokabilir.
numeric (15,2) de yapabilirsiniz.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
myalcin
Üye
Mesajlar: 63
Kayıt: 11 Mar 2008 03:45

Re: database küsürat mantığı?

Mesaj gönderen myalcin »

saolun numeric tada decimal işimi görecektir. Aklıma gelmemişti.
Teşekkürler. İyi Çalışmalar.
Cevapla