dataset float yuvarlama hatası

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
ibosah
Üye
Mesajlar: 7
Kayıt: 03 Oca 2008 04:08

dataset float yuvarlama hatası

Mesaj gönderen ibosah »

herkeze sağlıklı, mutlu, hayırlı yıllar

sistem

d2006
zeos
firebird.1.5.5 aslında farketmiyor mysql dede, postgre dede aynı hata var
zeos tan veya Tdataset ten olabilir?

hata veren alan tipleri veri tabanında numeric(18,4);

miktar*birim_fiyat=tutar hesaplamasında
bazı degerlerde tutar
mesala 2.22 gibi bir değer çıkması gerekirken
2.2254 gibi bir değer çıkıyor
ytl yuvarlaması yapıyorsun ama
fieldbyname('TUTAR').asFloat=2.22 gösteriyor
dataya yazarken bunu 2.2254 yapıyor

genelde bu hatayı 20 kayıtda bir büyük rakamlarda yapıyor

sonuçta yüzdelik hane 6-8 hane olabiliyor ama yuvarlama ile bu gideriliyor
sana gösterdigi ve veya başka bir değişkene aktarıldığındada dogru sonuç veriyor
ama dataya yazarken 2 hane yerine 4 hane yazıyor



RoundTo(x,-2);
SimpleRoundTo(x,-2); işe yaramıyor

yuvarlama functionu bu sekilde
degerler extended;

Gelen_Ye:=Gelen;
Result:=Gelen_Ye;
Kullanilan := Frac(Gelen);
if Length(FloatToStr(Kullanilan)) > 4 then
begin
Fark:=(Frac(Kullanilan * 100) / 100);
Gelen_Ye := Gelen_Ye - Fark;
a:=0;

try
a := StrtoInt(Copy(Floattostr(Kullanilan),5,1));
except

end;
//a := Kullanilan/100;
//if a >= 0.5 then Gelen_Ye := Gelen_Ye + 0.01;

if a >= 5 then
Gelen_Ye := Gelen_Ye + 0.01;

Result:=Gelen_Ye;
end;

{
bu tarz şeylerde işe yaramıyor
Temp1:='';
Temp2:='';
Temp1:=FloatToStr(Result);
if Pos(',',Temp1)>0 then
begin
Temp2:=Trim(Copy(Temp1,Pos(',',Temp1)+1,2));
Temp1:=Trim(Copy(Temp1,1,Pos(',',Temp1)-1));
Result:=StrToFloat(Temp1+','+Temp2);
end
else
Result:=StrToFloat(Temp1);
}

örnek degerler


1758713,9*
1626094,61=2859835193322,079
yuvarladıgımızda 2859835193322,08
datada 2859835193322,0796

554.270,3802*
1.230.910,93=682.257.469.163,435586

yuvarladıgımızda 682.257.469.163,44 oluyor ama dataya yazdıktan sonra
deger 682.257.469.163,4402



1.380.010,7691*
474.565,36=
654905307441,8102

654905307441,82 olması gerekiyor



1626800,4045
1551543,33
2524051316843,2796





RoundTo(x,-2);
SimpleRoundTo(x,-2); işe yaramıyor

bir çözümü varmıdır böyle bir bug varmı delphide
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Mesaj gönderen ikutluay »

iyide üstad alan zaten 18 4.. yani 18 ana ve 4 hane küsurat için . ki üstelik bence 4 yetmez 5 lazım.

kur programında isvec kronu küsurat 5 hane olmadığı için sorun çıkmıştı. rakam buyuk olunca hata 30-40 ytl yi buluyordu..

bu bug filan değil. rakam ne olursa olsun vt de uzantı 4 hane olacaktır. en fazla rakamı str yapar son iki haneyi 0 yapar geri rakama cevirir öyle yaparsın.
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 09:41
Konum: Güneyden
İletişim:

Mesaj gönderen White Rose »

siz veritabanında bunu numeric(18,4) olarak tanımlamışsınız o zaman
numeric(18,2) yapın
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Mesaj gönderen ikutluay »

White Rose yazdı:siz veritabanında bunu numeric(18,4) olarak tanımlamışsınız o zaman
numeric(18,2) yapın
Merhaba bu öneri için YTL için sorunu çözsede diğer para birimleri için büyük hataya yol açaçacaktır. en uygunu vt ye ne ise kaydeder ekranda ona uygun bir şekilde yuvarlayıp gösterir. YTL ise YTL yuvarlaması yapar diğeri ise normal yuvarlama yeterli zaten
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 09:41
Konum: Güneyden
İletişim:

Mesaj gönderen White Rose »

o zaman da küsüratlardan doğan hatalı hesaplar yapacaktır
ibosah
Üye
Mesajlar: 7
Kayıt: 03 Oca 2008 04:08

bunlar işe yaramıyor

Mesaj gönderen ibosah »

bu oluşan tutarlar toplanıp kullanıcıya borc alacak toplamı olarak gösteriliyor bunların toplamıda bir kaç kuruşluk fark yaratıyor

aslında miktar ve birim fiy onchange olayında bir procedure cağırıyor ve bu procedure dataset parametre olarak göderiliyor böylece stoktan faturadan da aynı hesaplama yapılabiliyor

stok_birimfiyonchange
tutar_hesapla(stok);
stok_miktARyonchange
tutar_hesapla(stok);



fatura_birimfiyonchange
tutar_hesapla(fatura);

fatura_miktarfiyonchange
tutar_hesapla(fatura);


işin garibi sadece bir alanın degişmesinde hesaplamada hata oluşmuyor sadece 2 alanda degiştigi vakit böyle bir sorun oluşuyor

ayrıcada mecburen 4 hane kullanma gerekiyor diğer döviz hesapları için
ytl kullanımında 2 hane olacak onun için datayı 18.2 yapamıyorum

ama su .2300 sonuda 2 sıfır ekleme olayını deneyecegim
ibosah
Üye
Mesajlar: 7
Kayıt: 03 Oca 2008 04:08

İlginiz için teşekkürler

Mesaj gönderen ibosah »

Bilgisayar fijutsi siemens amd turion 64 notebook
xphome sp2 var 1170 mb ram

bunu altında sene 2005 de wmware 40 da kurulmuş
virtual xpsp2 prof işletim sistemi 768 ram

buna d2006 zeos , firebird, Abbrevia305Beta6 kurulu

virtualleri wmplayer ile koşturuyorum (VMware-player-1.0.1-19317.exe)

aynı şekilde bunu d2007 dede denedim zeos, firebird, Abbrevia305Beta6 kurulu


bunu ayrıca mysql ve postgresqlde denemedim oda sorunlu

db unitin Tfloatfiled ında bir şey var gibi
,
sonuç elde var 0 değil işte, kafasına göre dolduruyor .33 den sonra 3. ve 4. haneleri :)

denemediğim bir şey kalmadı

value,asfloat,ascurrency,asbcd,asvariant

roundto, simpleroundto, binimum kodla dönüştürme parçala birleştir dönüştür işlemleri

bulduğum ve size verdiğim değerleri öylesine bir tablo yaratıp

ibx componenetleriyle denedim onda da aynı hata var ama çözülebiliyor

ibx tbcdfiled olarak tanıyor numeric(18,4) ü

ascurrency=Roundto(ascurency* ascurrency,-2);

bu şekilde doğru sonuç üretiyor

bunun haricinde oda sorunlu(value,asfloat vs gibi)


şimdi yaptığım testlerde yeni kayıt oluştururken bu hatayı hiç görmedim doğru bir şekilde
2 hane ve sonu 00 şelinde kayıtlar düzgün oluşuyor

ama iş editleyip değiştirmeye gelince bozukluk başlıyor

sadece bir alanı adeti veya birim fiyatı değiştirir seniz 1000 de bir
ikisini degiştirirseniz 100/ 5 hatalı kayıt oluşuyor

bu değerleri test programı otomatik random üretiyor bu arada

bir arkadaş şunu intel işlemcide denesin de diyeyim bu amd den oluyor
veya vitual altında çalışmak veya derlemekten oluyor diyeyim.
yada çok büyük ,gelmiş-geçmiş en büyük bug, yada çok ufak bir şeyi gözden kaçırıyorum?


3 alan açın numeric(18,4)
ilk ikisine verdigim degerleri girin beforepost ta ikisini çarpıp 3. atayın roundto(,-2) layıp

sizde de aynı hatalı sonuç veriyormu

804533,289*
1994726,37=1604823767111,1298

1626800,4045
1551543,33=2524051316843,2796

1380010,7691*
474565,36=654905307441,8102

554270,3802*
1230910,93=682257469163,435586

1758713,9*
1626094,61=2859835193322,079

1380010,7691
474565,36=654905307441,8102


792037,798*
520022,12=411877174836,0901


sonuçlar xxxxx,xx00 çıkması gerekiyor 411877174836,0900 gibi


proje bitti ama hiç bir işe yaramıyor hatalı bakiye veren veren bir program oldu sonuçta

nerden yaptım şu test programını bilmemki belkide hayatta hiç bu rakamlar girilmiyecekti :)
ibosah
Üye
Mesajlar: 7
Kayıt: 03 Oca 2008 04:08

kimse yokmu

Mesaj gönderen ibosah »

şu değerleri zeosta deneyececek

tşk.
Cevapla