# Number - Sayı

{% hint style="warning" %}
Javascript sayıları 64-Bit uzunluğunda 'Çift Duyarlı Kayan Nokta' olarak IEEE-754 standartlarında tutar. IEEE-754 standardından daha büyük sayılar kullanılırsa hata vermez, 'sonsuz' olarak değerlenir.
{% endhint %}

Bir sayısal büyüklük **tırnak içerisine alınmadan** doğrudan yazılırsa **`number`** tipinde olur. Bu şekilde matematiksel işlemlerde (toplama, çıkarma vb.) kullanılabilirler. Tırnak içerisinde yazılırsa **`string`** olur ve matematiksel işlemlerde **kullanılamazlar**. Örnek.

{% code lineNumbers="true" %}

```javascript
let tamSayi = 2023;
let ondalikliSayi = 20.23;
```

{% endcode %}

Javascript tamsayılar ve ondalıklı sayılar için number değişkenini kullanır. Farklı tipler olarak ele almaz. **`Number`** veri tipi ***güvenli olarak***  $$-(2^{53}-1)$$ ile  $$(2^{53}-1)$$ arasında değerler alabilir. Daha büyük veya küçük değerler de alabilir fakat karşılaştırmalarda yanlış sonuçlar üretir. Örneğin $$2^{55}+1$$ ile $$2^{55}+2$$ birbirlerine eşit mi sorusuna ***doğru*** cevabını alırsınız. Değer aralıklarını **`.MAX_VALUE`** ve **`.MIN_VALUE`** özellikleri ile görüntüleyin.

> **`.MAX_VALUE`** | **`.MIN_VALUE`** | **`.MAX_SAFE_INTEGER`** | **`.MIN_SAFE_INTEGER`**

{% code lineNumbers="true" %}

```javascript
alert('Number max değeri: ' + Number.MAX_VALUE);
alert('Number min değeri: ' + Number.MIN_VALUE);
```

{% endcode %}

Güvenli **tamsayı** değer aralıklarını **`.MAX_SAFE_INTEGER`** ve **`.MIN_SAFE_INTEGER`** özellikleri ile görüntüleyin.

{% code lineNumbers="true" %}

```javascript
alert(Number.MAX_SAFE_INTEGER); // 9007199254740991
alert(Number.MIN_SAFE_INTEGER); // -9007199254740991
```

{% endcode %}

Javascript HexaDecimal (16'lı), Octal (8'li) ve Binary (2'li) sayı sistemlerini kabul eder.

* **HexaDecimal - 16'lı Sayı Sistemi**
  * Sayılar 0-9 arasındaki rakamlar ve A-F arasındaki harflerle temsil edilir.
  * 0-9 arası rakamlar kendileri olarak, 10:A, 11:B, 12:C, 13:D, 14:E, 15:F olarak temsil edilir.
  * HexaDecimal sayılar '0x' ile başlayarak yazılır. Örnek: 0xFF
  * HTML Renk kodları bu sistemi kullanır ve gösterimi hashtag sembolü ile başlar. Örnek: #FFFFF
* **Octal - 8'li Sayı Sistemi**
  * Sayılar 0-7 arasındaki rakamlarla temsil edilir.
  * Octal sayılar '0o' ile başlayarak yazılır. Örnek: 0o377
* **Binary - 2'li Sayı Sistemi**
  * Sayılar 0 ve 1 ile temsil edilir.
  * Binary sayılar '0b' ile başlayarak yazılır. Örnek: 0b11111111

Javascript'te çok sıfırlı sayıları yazarken 'e' harfi kullanılabilir. Örnek olarak:

{% code lineNumbers="true" %}

```javascript
let nBin = 3e+3; // Üç Bin sayısı e'nin sağında 3 rakamı 3 sıfır anlamına gelir.
let nMilyon = 5e+6; //5 Milyon
let nMilyar = 9.45e+10; //94 Milyar 500 Milyon
let ondaN = 1e-1; //Sağdaki sayı negatif olursa ondalıklara geçer: Onda 1
let milyondaN = 1e-6; //Milyonda 1
let milyardaN = 4.56e-7; // Milyarda 456
```

{% endcode %}

**`Number`** tipinde iki tane ***özel değer*** vardır. Bunlar **Infinity** ve **NaN**'dır.

## Infinity Değeri

Sonsuz sayıları temsil eder. En büyük sayıdır. Javascript'in standardından daha büyük bir sayı yazarsanız veya bir sayıyı sıfıra bölerseniz **`Infinity`** değerini elde edersiniz. Hata almazsınız. Örnek.

{% code lineNumbers="true" %}

```javascript
let sayi1 = 1/0; // Sıfıra böldük: Infinity
let sayi2 = 1e309; // Max değeri aştık: Infinity
alert(sayi1);
alert(sayi2);
```

{% endcode %}

**`Infinity`** değeri bir **veri tipi değildir.** **`Number`** veri tipinin ***özel*** bir değeridir. Şunları deneyip sonucu görünüz.

{% code lineNumbers="true" %}

```javascript
let sonsuz = Infinity;
alert(25/sonsuz); // Sonuç: 0
alert(sonsuz/sonsuz); // Sonuç: NaN
alert(sonsuz-sonsuz); // Sonuç: Infinity
alert(sonsuz+sonsuz); // Sonuç: Infinity
alert(sonsuz*sonsuz); // Sonuç: Infinity
```

{% endcode %}

## NaN Değeri (Not a Number)

Matematiksel işlemi hatalı olan değişkenlerin değeridir. Örneğin bir harf rakama bölünemez. Bu durumda değeri **`NaN`** olur. Örnek.

{% code lineNumbers="true" %}

```javascript
let sayi1 = 'Karakter Dizisi' / 'Başka bir Karakter Dizisi';
alert(sayi1); // NaN
let sayi2 = 'Karakter Dizisi' - 15;
alert(sayi2); // NaN
let sayi3 = 'Karakter Dizisi' * 3;
alert(sayi3); // NaN
```

{% endcode %}

Bazı **`NaN`** değeri üreten işlemler. Deneyiniz.

{% code lineNumbers="true" %}

```javascript
let sonsuz = Infinity;
let sifir = 0;
alert(sonsuz/sonsuz); // NaN
alert(sifir/sifir); //NaN
alert(sonsuz*sifir); //NaN
```

{% endcode %}

## IEEE-754 Sayı Hataları

Birçok dilde kullanılan IEEE-754 standardı sayıları bellekte binary olarak tutar. Bunun sonucunda bazı yuvarlamaları otomatik olarak yapar ve hatalı sonuç döndürür. Örnek.

{% code lineNumbers="true" %}

```javascript
let sayi1 = 0.1;
let sayi2 = 0.2;
alert(sayi1+sayi2); // Sonuç: 0.30000000000000004
```

{% endcode %}

IEEE-754 standardı ondalık kısmı en fazla 16 basamağa kadar doğru verir. Ondalığın 17. basamağında yukarı doğru yuvarlamalar yapar. IEEE-754 varsayılan olarak 1  işaret digit'i, 52 tamsayı basamak digit'i ve 11 ondalık basamak digit'i tutar. Dolayısıyla binary olarak 52 basamaktan daha fazla olan bir tamsayı yazarsanız bunda da ***belirli bir düzende*** yukarı doğru yuvarlamalar yapar.

> Aşağıda büyük bir tamsayının 2'lik tabandaki binary karşılığı verilmiştir. Sayı binary olarak 54 digit'tir. Yani 54 basamak uzunluğundadır.
>
> $$9999999999999999 = (100011100001101111001001101111110000001111111111111111)\_2$$

{% code lineNumbers="true" %}

```javascript
let sayi = 9999999999999999;
alert(sayi); // Çıktı: 10000000000000000 sayısıdr.
```

{% endcode %}

Bu standardın 1 digit'i işaret olarak tuttuğunu ifade etmiştik. Bu durum sıfır (0) sayısı için de geçerlidir. Yani sıfır -0 ve +0 olarak iki sayı vardır. Sıfır sayısı iki türlü de binary olarak tamamen sıfırlardan oluştuğu için bu durum bir hataya sebep olmaz. Fakat -0 ve +0 standart olarak kullanılabilir. Aynı durum **`Infinity`** için de geçerlidir. Yani **`-Infinity`** ve **`+Infinity`** olarak kullanılabilir.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://hanuce.gitbook.io/javascript-egitimi/ilkel-primitive-veri-tipleri/number-sayi.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
