JavaScript’te “Equal…ish” Kavramı

JavaScript’te “equalish” kavramı, ondalık sayılarla yapılan işlemler sonucu ortaya çıkan yuvarlama hatalarını göz ardı edebilmek için kullanılır.

“Equal…ish” ifadesinin Türkçe çevirisini “eşit…gibi” şeklinde yaparsak sanıyorum ki ne olduğu daha da anlaşılacaktır.

Bilindiği üzere JavaScript’te karşılaştırma yaparken “Equality” (eşitlik) ve “Equivalence” (denklik) olmak üzere iki tane eşitlik operatörü kullanılmaktadır. Biraz daha detaylandırırsak:

  • “Equality comparison” kavramı aynı zamanda “double-equals” veya “loose equality” olarak adlandırılmaktadır ve “eşit eşit midir” == operatör ile gösterilir. Bu operatör, sadece değerlerin eşit olup olmadığını kontrol eder ve gerekirse değerleri karşılaştırmadan önce type coercion olarak bilinen tip dönüşümüne zorlar. Örneğin:

Yukarıdaki örneği incelediğinizde, “a” değişkeni bir sayı, “b” değişkeni ise bir dize (string) içermektedir. Ancak, “==” operatörü kullanıldığında, JavaScript otomatik olarak tür dönüşümü yapar ve “b” değişkeninin string olarak verilen değerini sayısal bir veri tipine dönüştürür. Haliyle, “a” ve “b” değişkenlerinin değerleri bu tür dönüşümünden sonra eşit olduğundan true sonucunu döndürür.

  • Buna karşılık “equivalence comparison” kavramı ise “triple-equals” veya “strict equality” olarak adlandırılmaktadır ve “eşit eşit eşit midir” === operatörü ile gösterilmektedir. Bu operatör, iki değerin hem değerlerinin hem de türlerinin eşit olup olmadığını kontrol eden bir equivalence comparison operatörüdür. Yukarıdaki örnekte == yerine === ile yazarsak sonuç true değil false döndürecektir. Bakınız:

Bu nedenle, JavaScript’te iki değerin sadece değerlerinin karşılaştırılması yeterli değilse, yani ayrıca türlerinin de eşit olup olmadığının kontrol edilmesi gerektiğinde, “===” operatörü kullanılmalıdır.

Buraya kadar her şey yolunda. Ancak her ne kadar kesin bir eşitlik için === operatörü kullanılması yetecek gibi bir izlenim verse de bazı anormallikler görülmektedir. Özellikle işin içine ondalık sayılar girdiğinde bazı garip davranışlar ortaya çıkmaktadır. Örneğin:

Yukarıdaki örnek, IEEE 754 özeliklerinden kaynaklanan bir kayan nokta hesaplama hatasının sonucudur. Zira bu hata, ondalıklı sayıların ikili (binary) formatta tam olarak temsil edilememesinden kaynaklanmaktadır.

İşte böylesi durumlar, belirli bir tolerans payı ile eşitliğe bakmamızı sağlayan “equal…ish” kavramını ortaya çıkarmıştır. Bu yöntemde, karşılaştırılacak iki sayı arasındaki farkın belirli bir tolerans değerinin altında olup olmadığını kontrol edebiliriz. Örneğimizi buna uygun bir şekilde güncelleyelim:

Yukarıdaki örneği incelediğimizde, ondalıklı sayılarla ya da bilgisayar jargonuyla kayan noktalı sayılarla (float) çalışırken bazı beklenmeyen sonuçların ortaya çıktığı görülmektedir. Haliyle beklenmeyen sonuçları önlemek adına iki değerin belirli bir tolerans aralığında eşit olup olmadığını kontrol etmek zorunda kaldığımız durumlar olacaktır.

Neyse ki imdadımıza matematik yetişmektedir. Matematiksel bir ifade olan ve ε şeklinde gösterilen epsilon kavramından yararlanırız. Epsilon, limit teorisinde sıfıra çok çok yakın sayıları ifade etmek için kullanılmaktadır. Zira epsilon ile temsil edilen sayılar, sıfıra çok yakındır ama sıfır değildir.

İşte bundan yararlanarak isEqualish adında bir fonksiyon yazabilir ve sayıları belirli bir hassasiyet seviyesinde karşılaştırabiliriz. Bakınız:

Yukarıdaki kodda, iki sayıyı ve bir tolerans değerini parametre olarak alan isEqualish adında bir fonksiyon tanımladık. Bu fonksiyon, iki sayının belirtilen tolerans değerine, yani epsilon parametresine göre birbirine ne kadar yakın olduğunu kontrol etmektedir. Eğer iki sayı arasındaki fark belirtilen toleranstan düşükse, fonksiyon true döndürüyor. Bu sayede, ondalık sayılarla yapılan işlemlerde oluşabilecek küçük yuvarlama hatalarını göz ardı edebiliyoruz.

Özetle JavaScript’te equalish kavramı, farklı bir karşılaştırma yöntemi sunar ve karşılaştırılacak iki ondalıklı sayı arasındaki farkın belirli bir tolerans değerinin altında olup olmadığını kontrol eder. Bu sayede, beklenmeyen sonuçlara karşı önlem alabiliriz.

İlgili Makaleler

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu