Javascript yuvarlama hatası çözümü

0
196

Bu yazımızda javascript ile yapılan aritmetik işlemlerde ortaya çıkan yuvarlama hatasından ve çözümünden bahsedeceğiz.

Bana göre web uygulamalarında javascript kullanmanın en güzel yanı sayfanın tekrar yüklenmesine gerek kalmadan kodların dinamik çalışabilmesidir. Javascript konusunda derinlemesine bilgi sahibi değilim ama karşılaştığım problemi nasıl çözdüğümü anlatacağım.

Öncelikle sorundan bahsedeyim;

var sayi1 = 0.1;
var sayi2 = 0.2; 
var toplam = sayi1 + sayi2; // toplam = 0.30000000000000004

0.1 + 0.2 işleminin sonucu doğal olarak 0.3 olması gerekir ama javascript ile toplama işlemi yapıldığında sonuc 0.30000000000000004 çıkıyor. (Bu sorun javascript dilinin ondalık sayılarda hassas olmamasından kaynaklanıyor.)

Bu sorunu çözmek için toFixed() fonksiyonunu kullandım.

var toplam = 0.30000000000000004;
var yuvarla = toplam.Fixed(4); // yuvarla = 0.3000

toFixed(4) fonksiyonunu kullanarak virgülden sonrasını 4 haneye yuvarlamış oldum. Bu defa iki problem ortaya çıktı. Birincisi toFixed() fonksiyonuna giren sayı tam sayı olsa bile virgülden sonra 4 haneli çıktı alınıyor.

var sayi1 = 10;
var sayi2 = 9.5;
var sayi3 = 9.75;

var sonuc = yuvarla.sayi1.toFixed(4); // sonuc 10.0000
    sonuc = yuvarla.sayi2.toFixed(4); // sonuc  9.5000
    sonuc = yuvarla.sayi3.toFixed(4); // sonuc  9.7500

İkinci sorun ise sayı, 10-4 değerinden küçükse sıfıra yuvarlanıyor.

var sayi1 = 0.000012;
var sayi2 = 0.00000025;

var sonuc = yuvarla.sayi1.toFixed(4); // sonuc 0.0000
    sonuc = yuvarla.sayi2.toFixed(4); // sonuc 0.0000

Problemi çözmek için virgülden sonra gösterilecek hane sayısını 12 olarak değiştirdim.

var sayi1 = 0.000012;
var sayi2 = 0.00000025;
var sayi3 = 12.254;
var sayi4 = 5;

var sonuc = yuvarla.sayi1.toFixed(12) // sonuc  0.000012000000
    sonuc = yuvarla.sayi2.toFixed(12) // sonuc  0.000000250000
    sonuc = yuvarla.sayi3.toFixed(12) // sonuc 12.254000000000
    sonuc = yuvarla.sayi4.toFixed(12) // sonuc  5.000000000000

Sonuç tam sayı olsa bile virgülden sonra 12 sıfır eklenmesi görünümü bozdu. Bunun üstesinden gelebilmek için bulduğum çözüm şu;

var sayi1 = 0.000012;
var sayi2 = 0.00000025;
var sayi3 = 12.25443256789;
var sayi4 = 5;

var sonuc = sayiDuzenle(sayi1);       // sonuc  0.000012
    sonuc = sayiDuzenle(sayi2);       // sonuc  0.00000025
    sonuc = sayiDuzenle(sayi3);       // sonuc 12.2544;
    sonuc = sayiDuzenle(sayi4);       // sonuc  5
    sonuc = sayiDuzenle(0.1 + 0.2);   // sonuc  0.3



  function sayiDuzenle(sayideger) {
        if (sayideger < 1) {
        sayideger = sayideger.toFixed(12).toString().replace(/(\.[0-9]*[1-9])0+$|\.0*$/,'$1');
        }
        else
        {
        sayideger = sayideger.toFixed(4).toString().replace(/(\.[0-9]*[1-9])0+$|\.0*$/,'$1');
        }
        return sayideger
   }

Sonucu ekrana yansıtırken sayı 1 den küçük ise virgülden sonra gösterilecek hane sayısını 12 olarak belirledim. Sayı 1 ‘e eşit veya 1 ‘den büyük ise virgülden sonra gösterilecek hane sayısını 4 olarak belirledim. Sayıyı metin formatına çevirip replace() fonksiyonu ile eklenen gereksiz sıfırlardan kurtuldum.

Sitemizin Araçlar kategorisindeki hesaplamalarda bu yöntem kullanılıyor.

Faydalı olması dileğiyle..

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz