Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
[ÇÖZÜLDÜ] Delphi Formül Hesaplamaları Hk.
#1
Arkadaşlar selam,

Yine bir excel formülünü programa anlatabilme ve aynı sonucu çıkarma çabasındayım. Her zamanki gibi tutmadı yine. Delphi içinde formüllerin bir sıralaması ya da bu sıralamayı değiştirecek bir ayarı var mı bulamadım.
Exceldeki formül : = (G10*AU10*AW10) /1000*80/62-(G10-V10*(1-AN10/100))*(AU10*(AW10/1000)*80/62)-V10*(AN10/100)*(AW10/1000)*80/62
çıkan sonuç : 6.51

Ben ise bu formüldeki aynı sıraya göre yaptığımda ise çıkan sonuç : 4.05
Delphinin burada hesaplama davranışı nasıl? Yani klasik olarak bildiğimiz, önce parantez içlerinin işlemini tamamlayıp, daha sonrasında diğer işlemlere mi geçiyor, ya da, sen ne yazdıysan ben onu aynen okurum diye mi çalışıyor? Bu konuda tecrubesi olan arkadaşlarımızdan yardım alırsam çok sevinirim.
Cevapla
#2
formullerin sıralamasını parantezler ile yapacaksınız, mesela en baştaki /1000*80/62- kısmı belirsiz görünüyor, en sondaki *80/62 kısmı ona keza belirsiz görünüyor, çarpma, bölme, toplama ve çıkarma sıralaması ile gidiyordu sanırım işlem sıraları. en sonda mesela bütün işlemler yapıldıktan sonra mı 80 ile çarpıp 60 a bölücek yoksa (AW10/1000) kısmınamı uygulayacak ????

bence aşağıdaki gibi olmalı ;

(((G10*AU10*AW10) /1000*80/62)-(G10-V10*(1-AN10/100))*((AU10*(AW10/1000)*80/62)-V10)*(AN10/100)*(AW10/1000))*80/62
WWW
Cevapla
#3
Merhaba,
Excel'in kullandığı formülde temel matematiksel operatörler kullanılmış. Parantezler de sabit olduğuna göre Excel formülünü kopyalayıp, doğrudan kod içerisine yapıştırıp kullanabilirsiniz. 
Öyle yaptı iseniz, aradaki farkın yuvarlamalardan kaynaklı olduğunu söyleyebilirim.
Delphi tarafında, G10, AU10, AW10 gibi sabitlerinizi yüksek hassasiyetli veri tipleri olarak tanımlayın.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#4
Hücrelere aşağıdaki değerleri girdiğinizde
G10 = 10
AU10 = 20
AW10 = 30
V10 = 40
AN10 = 50

Excel de 7,891779396 sonucunu mu buluyorsunuz? Yada 6.51 bulduğunuz Excel hücre değerlerini belirtebilir misiniz?
Cevapla
#5
(12-06-2020, Saat: 18:02)Fesih ARSLAN Adlı Kullanıcıdan Alıntı: Merhaba,
Excel'in kullandığı formülde temel matematiksel operatörler kullanılmış. Parantezler de sabit olduğuna göre Excel formülünü kopyalayıp, doğrudan kod içerisine yapıştırıp kullanabilirsiniz. 
Öyle yaptı iseniz, aradaki farkın yuvarlamalardan kaynaklı olduğunu söyleyebilirim.
Delphi tarafında, G10, AU10, AW10 gibi sabitlerinizi yüksek hassasiyetli veri tipleri olarak tanımlayın.
@Fesih ARSLAN 
@esistem 
@Hayati 

Fesih hocam, şu andaki yapı exceldeki aynı sıralama ile gidiyor. Hassasiyetleri de vigülden sonra 3 hane olacak şekilde planladım. Lakin yine de sonuç çok farklı çıkıyor. @esistem  üstadın söylediği şekilde de formulize edeceğim. Umarım bir sonuç elde ederim.
Cevapla
#6
Ben, parantez duzeni yani islem oncelik sirasi ile ilgili oldugunu dusunuyorum
Cevapla
#7
Değişken veri tiplerini önce Single, sonra da double olarak tanımlayıp, sonuçlarını ayrı ayrı gözlemleyin.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#8
Denedim, Delphi10.3, Excel ve LibreOffice de virgülden sonra 15 karakter tam uyuşuyor. Yani 0,123456789012345
Delphi ile değer atamada bir yanlış yazımınız olabilir. Kodların bizi ilgilendiren kısımlarını dosya halinde paylaşır mısınız?
Ağlarsa kablosuz ağlar, gerisi yerel ağlar...
Cevapla
#9
Excel'de bir hücredeki sayı virgülden sonra 3 basamak göstersin diye ayarlansa bile hesaplamada sayının tümü hesaba katılıyordur ve fark bu sebepten oluşuyordur diye tahmin ediyorum.
There's no place like 127.0.0.1
WWW
Cevapla
#10
Selamlar
Formuleri aşağıdaki şekilde yapılandırarak doğru sonuca ulaştım. Öncelikler parantez içine veriliyor gördüğüm kadarı ile. Hepinize ilginizden dolayı çok teşekkür ederim.

= (G10*AU10*AW10) /1000*80/62-(G10-V10*(1-AN10/100))*(AU10*(AW10/1000)*80/62)-V10*(AN10/100)*(AW10/1000)*80/62

Formul1 = (G10*AU10*AW10)
Formul2 = (G10*AU10*AW10) /1000*80/62
Formul3 = (1-AN10/100)
Formül 4 = (G10-V10*(1-AN10/100))
Formul5 = (AW10/1000)
Formül 6 = (AU10*(AW10/1000)*80/62)
Formul7 = (AN10/100)

Sonuç = (formul2)-(formul4)*(formul6)-dm.qryanalizler.fieldbyname('varsonu_pres_camur').value* dm.qryanalizler.fieldbyname('analiz_yika_keknemi').value/100)*formul7*formul5*80/62;
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Delphi 10.1 Berlin, FireDac, SQLite, .s3db Gürcan 2 266 28-07-2020, Saat: 10:57
Son Yorum: Gürcan
Heart Delphi Edge Web Tarayıcı ahmmetdelphi 9 532 26-07-2020, Saat: 09:12
Son Yorum: ahmmetdelphi
  Delphi 10.3.3 Fast Report MEDCEZİR 2 350 20-07-2020, Saat: 11:57
Son Yorum: kaplanalpay0
  Krityere göre listeleme - çözüldü ekank 3 427 16-07-2020, Saat: 22:05
Son Yorum: ekank
  (Çözüldü)Memory aşımı powerghost 14 1.181 16-07-2020, Saat: 10:50
Son Yorum: mrmarman



Konuyu Okuyanlar: 1 Ziyaretçi