Delphi Can
MSSQL e kaydettiğimde eklenen küsürat - Baskı Önizleme

+- Delphi Can (https://www.delphican.com)
+-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3)
+--- Forum: Genel Programlama (https://www.delphican.com/forumdisplay.php?fid=6)
+--- Konu Başlığı: MSSQL e kaydettiğimde eklenen küsürat (/showthread.php?tid=8197)



MSSQL e kaydettiğimde eklenen küsürat - nevzatc - 23-10-2025

Mssql field -> SLAMOUNT (Float)
Info1, Info2: Double
Amount, FAmount: Double

Info1 := 300
Info2 := 0,3

Amount := 0,1

FAmount := Amount * (Inof1 / Info2)

Sonuç: FAmount = 100

Update xxxtablom Set SLAMOUNT=FAmount Where (Referans=xxx)

Veritabanındaki alana kaydedilen : 100,00000000000001

haliyle bu durum 100,00000000000001 > 100 gibi bir karşılaştırmada sorun yaratıyor

bunu neden yaptığı konusunda bilgi verebilecek arkadaşlara şimdiden teşekkür ederim.


MSSQL e kaydettiğimde eklenen küsürat - kajmerantime - 23-10-2025

Merhaba.

Parasal ve hassas hesaplamalar için Float/Double yerine DECIMAL/NUMERIC kullanmak daha doğru bir yaklaşımdır. Bu tipler ondalık değerleri binary yerine decimal olarak sakladıkları için bu tür sorunlar yaşanmaz.

Hesaplamalarınızda:
0,1 ve 0,3 gibi sayılar binary sistemde sonsuz basamaklı sayılardır (tıpkı 1/3'ün decimal sistemde 0,333... olması gibi)
Bu değerlerle yapılan işlemler sırasında küçük yuvarlama hataları birikir.
Sonuç olarak 100 yerine 100,00000000000001 gibi bir değer elde edersiniz.


MSSQL e kaydettiğimde eklenen küsürat - nevzatc - 23-10-2025

Önemli olan ilk 8 basamaktı bu yüzden kaydetme ve güncelleme sql leri içinde Round(FAmount, 8) kullandım, bu şekilde veritabanına normal şekilde kaydettirdi şimdilik bu şekilde bu sorunumu aştım.
Teşekkürler


Cvp: MSSQL e kaydettiğimde eklenen küsürat - kajmerantime - 23-10-2025

(23-10-2025, Saat: 15:51)nevzatc Adlı Kullanıcıdan Alıntı: Önemli olan ilk 8 basamaktı bu yüzden kaydetme ve güncelleme sql leri içinde Round(FAmount, 8) kullandım, bu şekilde veritabanına normal şekilde kaydettirdi şimdilik bu şekilde bu sorunumu aştım.
Teşekkürler

Sorunun çözülmesine sevindim. Bize de fikir oldu Smile
İyi çalışmalar.


Cvp: MSSQL e kaydettiğimde eklenen küsürat - nevzatc - 24-10-2025

(23-10-2025, Saat: 16:21)kajmerantime Adlı Kullanıcıdan Alıntı:
(23-10-2025, Saat: 15:51)nevzatc Adlı Kullanıcıdan Alıntı: Önemli olan ilk 8 basamaktı bu yüzden kaydetme ve güncelleme sql leri içinde Round(FAmount, 8) kullandım, bu şekilde veritabanına normal şekilde kaydettirdi şimdilik bu şekilde bu sorunumu aştım.
Teşekkürler

Sorunun çözülmesine sevindim. Bize de fikir oldu Smile
İyi çalışmalar.

Sağ olun size de iyi çalışmalar.  Shy