
HOŞGELDİNİZ , Toplam : 1527
YTL'ye geçiş ile beraber noktadan sonrası çok kritik oldu, özellikle finans uygulamalarında. Veritabanında decimal(20,2) tutar alanlarına gözümüz çoktan alıştı.
Veritabanında decimal (numeric) olarak tanımladığımız alanları java uygulamasında BigDecimal ( java.math.BigDecimal) ile karşılarız.Finans uygulamalarında (örnek: para pul, faiz işlemleri..) BigDecimal çok kullanılır.
BigDecimal ile işlem yaparken dikkat etmemiz gereken bazı noktalar var. Bu yazıda bu detayların tamamına girebilmemiz mümkün değil. Sadece YTL değerini gösterirken kullandığımız format işlemi ile ilgili örnek geliştirmeye çalışacağız.
Finans uygulamalarında çarpma, bölme işlemlerinde işin içine yuvarlama (round) ve ondalıklı haneleri (scale) belirleme girer ki uygulama biraz daha karmaşıklaşır.
BigDecimal değerlerin okunabilirliğini artırmak için format işlemi uygulanır. Bu işleme dikkat etmek gerekir. Gerçek değer ile formatlanmış değer farklılaşabilir. Bunun nedeni format işleminin sadece double değerlere uygulanıyor olması. Formatlama istenirse BigDecimal değerinin doubleValue() kullanılarak double değere dönüştürülmesi gerekir. BigDecimal değeri double 'a dönüştürülürken küçük kayıpların yaşanabileceğini bilelim. Bu kayıplar küçük değerler için sözkonusu değildir.
Ayrıca hepimizin bildiği bir konuyu da hatırlatmak isterim. Java ve veritabanı uygulamalarında uygulamanın istediğimiz gibi davranması sürücü(driver) ye çok bağlıdır. Kullandığımız sürücünün kesinlikle güvenilir-stable- olması gerekir. Ayrıca çalıştığımız veritabanının özelliklerinin (neleri destekliyor, neleri desteklemiyor?) yeterli olması ve bu özelliklerin iyi bilinmesi gerekiyor. Bundan sonrası artık java uygulamasına yani sizin yazılımcılığınıza kalır.
Aşağıda konu ile ilgili iki örnek uygulamadan alıntı var. Önce veritabanına bakalım :) Hesap adında bir tablomuz olsun. Tablonun DDL'i:
select * from Hesap ifadesini çalıştırdığımızda
olduğunu görüyoruz. Ayrıca
ifadesini çalıştırdığımızda
Yukarıdaki işlemleri SQL aracımızda gerçekleştirdik. Henüz java uygulamasına bulaşmadık. 9999999999999999.17 sayısının tam sayı kısmı 16 hane ve ondalıklı kısmı 2 hane. Tabloya bu sayıyı içeren 2 kayıt ekledik. Bu alanların toplamı(SQL sum ile) bize 19999999999999998.34 değerini verir. Toplam değer 19999999999999998.34 yani tam sayı kısmı 17 hane ve ondalıklı kısmı 2 hane.
Ondalıklı toplamada toplanan sayıların ondalıklı kısmı 2 haneli ise toplam sayıda ondalıklı kısım hiçbir zaman 2 haneliden fazla olmaz. Bu çıkarma işlemi için de geçerlidir. Yukarıda anlatıldığı gibi çarpma ve bölme işleminde böyle olmaz :)
Ayrıca 16 haneli değerlerin toplamı da 17 haneli olabilir (kesin olur demiyorum, dikkat buyurun) Bu son derece normal değil mi? Bundan kaçma olabilir mi? Mümkün değil? Sadece uygulamalarımızda -gerek veritabanı tarafında gerekse java ya da benzeri programla dili ile geliştirdiğimiz uygulamalarda- veri tipimizi veriye uygun olarak seçmeliyiz.
Şimdi gelelim java uygulamalarına. Bunun için 2 tane test uygulaması geliştirdik ve Sybase 12.5 veritabanında test ettik. Sürücü olarak JDBC 3 destekleyen jconn3.jar kullanıyoruz.1. uygulama tablodaki kayıtları tek tek gezerek hem BigDecimal ile hem de double ile toplam oluşturuyor. Uygulamanın ilgili kısmı :
Uygulamayı çalıştırdığımızda elde ettiğimiz sonuç aşağıdadır.
Toplam Bakiye BigDecimal: 19999999999999998.34
Toplam Bakiye double(no format): 2.0E16
Toplam Bakiye double(formatlı): 20.000.000.000.000.000,00 YTL
Görüldüğü gibi BigDecimal değerinde sorun yok fakat double değerler gerçek değeri yansıtmıyor!!
2. uygulamada bu sefer select sum(bakiye) ile benzer işlemleri yineleyelim.
Toplam Bakiye BigDecimal: 19999999999999998.34
Toplam Bakiye double(no format): 2.0E16
Toplam Bakiye double(formatlı): 20.000.000.000.000.000,00 YTL
BigDecimalda yine sorun yok, fakat double değerlerde farklılaşma sözkonusu!!
BigDecimal değer double değere dönüştürülürken büyük değerler için küçük de olsa farklılaşmanın olduğunu gördük. Finans uygulamaları gibi kritik uygulamaların gerçek değerler üzerinden işlem yapması gerektiğini hep hatırlayalım.
Not : Bu yazı jdbc_tr yahoo grubunda bir soruya verdiğim cevabın düzenlenmiş halidir.
Sizden önce 1996 kişi okudu.
İlk yorumu yazan siz olmak ister misiniz?
Atom Nedir ?
Bilgisayar
Virüslerden Nasıl Korunuruz ?
Arama Motorları ve Hukuki Durumları
İnternette hız rekoru kırıldı
MSN Nickleri
MSN ifadeleri
Random Quit
Kanaldaki +i modunu istediğin nicke yansıtmamak
Who nedir, nasıl kullanılır
Sabit sürücü nedir?
DVD sürücü nedir?
Disket sürücü nedir?
CD Sürücü nedir?
Yeni Intel işlemciler 2008'de
Desibel Nedir
Kondansatör
Güç kaynağı nedir?
Japonlar dünyanın en hafif dijital kamerasını üretti
Adım Adım Panel Televizyonlar
Bazı atıkların denizde yok olma süreleri
İnsan Sesi Nasıl Oluşur ?
Ezop Kimdir ?
Okyanus Ne Kadar Derindir?
Türk Tarihinde İlk Kadınlar
Terimler (Piksel, Rezolasyon, Anti-aliasing)
Photoshop ile Template düzenlemek
Photoshop Dersleri(insanı uzaylıya çevirme)
Photoshop Dersleri(Yıldırım Yapımı)
Photoshop Dersleri(Alevli Yazı Yapımı)
Güvenlik duvarı (firewall) nedir?
Bilgisayarımızdaki virüsleri temizleyelim.
Sanal dünyada oltaya gelmeyin
Virüslü sevgililer günü maili
Mono's XSP ASP.NET Sunucusunda Güvenlik Açığı
Unix
İşletim sistemi nedir?
Microsoft Tahiti Beta'yı deniyor
Microsoft tazminata mahkum oldu
Korsan Windows ta milat 20 Şubat
bilgisayar.tv uzantılı ücretsiz 2 gb mail
Elektronik posta sunucusu
Posta hesaplarının oluşturulması ve yönetimi
Hotmailiniz 2GB'a Çıkarın ve Hotmail Beta'ya Sahip Olun
SMTP Local Mail Kurulumu
MSN Avatarları
MessengerDiscovery Live 1.2.0211
Mail MSN Hacklenme yada çalınma durumlarında yapılması gerekenler
Msn e Format
MSN yüklemeden internet üzerinden mesajlaşma
Japonya Yeni Bir İnternet Arıyor
Multimedia nedir?
İnternet tehlike altında
Windows XP de ADSL hızını artıralım.
Türk Telekom ADSL hızını yükseltmeye hazırlanıyor.
Alone in the Dark
Knightonline Levellara Göre Görevler
Knightonline Kullanıcı Ara Yüzü
Click&Buy üyelik alımı(adım adım anlatım)
Ogame Başlangıç Taktikleri
Tune up utilities 2006
Winamp ta ses kalitesi nasıl yükseltilir
Kamerayla çektiğimiz görüntüleri DVD olarak kaydedelim
Windowsunuzu tek tık ile hızlandırın
Resimlerinizi ASCII Karakterlere dönüştürün
Dosya Uzantıları ve Açıklamaları
Delphi ile Network Üzerinden Veri İletimi
Delphi de Dosya Arama Fonksiyonları
Delphi′de TIniFile ve TRegIniFile Bileşenleri
Asp ile Cookie Yaratmak
Arama Motoru Optimizasyonu (Arama dışı optimizasyon)
Meta tag SEO Optimization
Lycos' a Php Nuke 7.6 Kurulumu
Joomla Kurulumu ve Yönetimi
Web Sitesi ve CGI Uygulamalarinin Güvenligi
13 Kentte Dijital Yayin 6 Ay içindeBaşlar
Antenler Tarihe Karışacak
Vestel Aphro Menü Key Dosyası Polsat Ok 05-01-2007
Goldmaster 4000-9000 Serisi Yukleme Programları
Goldmaster 8000-10200 Serisi Yukleme Programları
Yaz sıcakları ve gebelik
Gebelikte seyahat
Gebelik planlaması
Doğum sonrası depresyon
Çalışan kadın ve hamilelik