Firebird2.1.3 Round Sorunu?

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
mahsuni
Üye
Mesajlar: 99
Kayıt: 21 Haz 2003 01:09
Konum: Ankara-Mamak

Firebird2.1.3 Round Sorunu?

Mesaj gönderen mahsuni »

Herkese iyi geceler.

Tablomun yapısı aşağıdaki gibi.

Kod: Tümünü seç

CREATE TABLE DENEME (
    MIKTARI   DOUBLE PRECISION,
    FIYATI     DOUBLE PRECISION,
    TAM    COMPUTED BY (trunc(miktari*fiyati*100+0.5)),
    ATUTARI    COMPUTED BY (round(miktari*fiyati,2))
);
Veriler aşağıdaki gibi:

Kod: Tümünü seç

MIKTARI FIYATI   TAM     ATUTARI  
1.75        2.78     486?    4.86  Yanlış tutar (4 çift sayı aşağı yuvarlamış),
2.75        2.78     765     7.65  Doğru tutar (7 tek sayı yukarı yuvarlamış)
Normal çarpma ile elde ettiğim sonuç

Kod: Tümünü seç

select round(1.75* 2.78,2) as BTUTARI from RDB$DATABASE // sonuç=4.87 

Kod: Tümünü seç

ATUTARI=4.86  (yanlış olduğunu düşündüğüm sonuç)
BTUTARI=4.87  (Benim elde etmek istedğim sonuç)
Ayrıca
1. satırda Tam=487 olması gerekirken, 486 olmuş?
Bu iki değerin farklı olmasının nedeni hakkında, fikir ve görüşlerinizi bekliyor
Şimdiden herkese teşekkürlerimi sunarım
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: Firebird2.1.3 Round Sorunu?

Mesaj gönderen Lost Soul »

TAM COMPUTED BY (trunc(miktari*fiyati*100+0.5)),

burada round ile yuvarlaman gerekirken trunc ile virgül kısmını atmışsın onda dolayı.
mahsuni
Üye
Mesajlar: 99
Kayıt: 21 Haz 2003 01:09
Konum: Ankara-Mamak

Re: Firebird2.1.3 Round Sorunu?

Mesaj gönderen mahsuni »

Cevap için teşekkürler Lost soul,

Belirtmiş olduğun TAM kolonu ATUTARI kolonundan bağımsızdır.
Kaldıki TAM kolununu kaldırsam bile sonuç değişmiyor.

TAM kolonunu; trunc fonksiyonunda sorun olduğunu izah
edebilmek için sonradan ekledim. Gerçekte öyle bir kolonum yok.
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Re: Firebird2.1.3 Round Sorunu?

Mesaj gönderen Hakan Can »

"select round(1.75* 2.78,2) as BTUTARI from RDB$DATABASE" şeklinde IBOConsole'de çalıştırdığımda önce hata verdi. IBOConsole içinde External Functions içinde ROUND varmış. DROP ettikten sonra çalıştırdığımda 4.87 döndürdü. Yani olması gerekeni döndürdü.

Muhtemelen External function olarak kalmış ve Delphi'nin ROUND fonksiyonu kullanılmış.
mahsuni
Üye
Mesajlar: 99
Kayıt: 21 Haz 2003 01:09
Konum: Ankara-Mamak

Re: Firebird2.1.3 Round Sorunu?

Mesaj gönderen mahsuni »

Kod: Tümünü seç

select round(1.75* 2.78,2) as BTUTARI from RDB$DATABASE
satırında bende de sonuç doğru dönüyor.

Ama

Kod: Tümünü seç

CREATE TABLE DENEME (
    MIKTARI   DOUBLE PRECISION,
    FIYATI     DOUBLE PRECISION,
    TAM    COMPUTED BY (trunc(miktari*fiyati*100+0.5)),
    ATUTARI    COMPUTED BY (round(miktari*fiyati,2))
);
bu tabloya değerleri girdiğimde sonuç 4.86 çıkıyor.?
Bu farklılığı anlayamadım.
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Re: Firebird2.1.3 Round Sorunu?

Mesaj gönderen Hakan Can »

Hocam bu sorun round ile ilgili değil anladığım kadarıyla.

Sorun çarpma işlemi (veya FireBird'ün sayısal veritipi yapısı) ile ilgili.

Yani:

miktari*fiyati = 4.865 gibi gözükse de:
miktari*fiyati = 4.864999999999999 gibi birşey aslında.

Anlamak için şu iki queryi (veya benzerini) çalıştırabilirsin:

SELECT miktari*fiyati, round(miktari*fiyati,2) FROM DENEME
SELECT miktari*fiyati, round(miktari*fiyati,2) FROM DENEME WHERE miktari*fiyati = 4.865

İlkinde 4.865 gibi gözüküyor ama ikincisinde kayıt dönmüyor.

Ayrıca düzgün çalışan diğer queryi şu şekilde yapınca da sonuç yanlış dönüyor:

select round(CAST(1.75 AS DOUBLE PRECISION)* CAST(2.78 AS DOUBLE PRECISION),2) as BTUTARI from RDB$DATABASE

Bölme işlemi ile ilgili bu sorun daha önce başıma gelmişti ve ancak verdiğim WHERE'li SELECT komutuyla sorunu anlayabilmiştim.

Kolay gelsin.
Cevapla