Excel'de Ondalık Sayılarda Çıkarma Hatası

Katılım
8 Nisan 2021
Mesajlar
9
Excel Vers. ve Dili
Office 365, Türkçe
Merhaba, ondalık sayılarda çıkarma yaparken 0,70-0,67 işleminin sonucunu yanlış verdiğini fark ettim.

A1 hücresine manuel olarak 0,70; B1 hücresine manuel olarak 0,67 yazıyorum. C1 hücresine =A-B yazıyorum. C1 hücresinin sonucu 0,0299999999999999 oluyor.

Bunun nedeni nedir ?

Yardımcı olursanız çok sevinirim.
 

muhasebeciyiz

Altın Üye
Katılım
10 Şubat 2006
Mesajlar
1,010
Excel Vers. ve Dili
Office 2016
64 Bit
Altın Üyelik Bitiş Tarihi
21-12-2027
Senin yazdığın:
A1 = 0,70
B1 = 0,67
C1 = A1 - B1 = 0,03 olması gerekirken 0,0299999999999999 oluyor.

Bunun nedeni, bilgisayarın 0,70 ve 0,67 gibi ondalıklı (ve on tabanlı) sayıları ikili (binary) sistemde tam olarak temsil edememesidir.

Excel’de bu tür hassasiyet sorunlarını çözmek için genelde YUVARLA fonksiyonu kullanılır:
=YUVARLA(A1-B1; 2)
 
Katılım
8 Nisan 2021
Mesajlar
9
Excel Vers. ve Dili
Office 365, Türkçe
Senin yazdığın:
A1 = 0,70
B1 = 0,67
C1 = A1 - B1 = 0,03 olması gerekirken 0,0299999999999999 oluyor.

Bunun nedeni, bilgisayarın 0,70 ve 0,67 gibi ondalıklı (ve on tabanlı) sayıları ikili (binary) sistemde tam olarak temsil edememesidir.

Excel’de bu tür hassasiyet sorunlarını çözmek için genelde YUVARLA fonksiyonu kullanılır:
=YUVARLA(A1-B1; 2)

Aynı problem 0,60-0,57 işleminde ya da 0,50-0,47 işleminde olmuyor. 0,70-0,67 işleminin diğerlerinden farkı nedir ?
 

muhasebeciyiz

Altın Üye
Katılım
10 Şubat 2006
Mesajlar
1,010
Excel Vers. ve Dili
Office 2016
64 Bit
Altın Üyelik Bitiş Tarihi
21-12-2027
0,5 = 1/2 → binary olarak tam temsil edilebilir.
0,25 = 1/4 → yine tam temsil edilir.
0,1 = 1/10 → tam temsil edilemez.
Aynı durum, 0,70 ve 0,67 için de geçerlidir: Bu sayılar ikili sistemde tam temsil edilemez, ama 0,60 veya 0,57 gibi bazı sayılar daha az hata ile temsil edilebilir.
******************************************
Peki Neden 0,70 - 0,67 = 0,02999999... ?
Bu sayıların ikili karşılıkları tam sayı değildir, dolayısıyla işlem sonucu "0,03" yerine yaklaşık bir sayı olur: 0,0299999999999999.
2. 0,60 ve 0,57 daha az hata içeriyor olabilir
Bu sayılar da binary sistemde yaklaşık olarak temsil edilir, ama hata miktarı o kadar küçüktür ki 0,03 sonucu tam çıkacak şekilde yuvarlanabilir.
******************************************

İşlem

Gerçek Sonuç

Bilgisayarın Sonucu

0,70 - 0,67

0,0300000000000000

0,0299999999999999 ❌

0,60 - 0,57

0,0300000000000000

0,0300000000000000 ✅

0,50 - 0,47

0,0300000000000000

0,0300000000000000 ✅



Bu tür küçük farklar genellikle YUVARLA fonksiyonu ile çözülür:
=YUVARLA(A1-B1; 2) VEYA =ETOPLA(A1; -B1)

Özetle :
Sorun, sayının binary sistemde tam temsil edilememesi.
Bazı ondalık sayılar daha “uygun” olduğundan sorun çıkarmıyor.
Bu yüzden 0,70 - 0,67 ≠ 0,03 çıkıyor, ama 0,60 - 0,57 = 0,03 çıkıyor.
YUVARLA kullanmak en güvenli yoldur
 
Katılım
8 Nisan 2021
Mesajlar
9
Excel Vers. ve Dili
Office 365, Türkçe
0,5 = 1/2 → binary olarak tam temsil edilebilir.
0,25 = 1/4 → yine tam temsil edilir.
0,1 = 1/10 → tam temsil edilemez.
Aynı durum, 0,70 ve 0,67 için de geçerlidir: Bu sayılar ikili sistemde tam temsil edilemez, ama 0,60 veya 0,57 gibi bazı sayılar daha az hata ile temsil edilebilir.
******************************************
Peki Neden 0,70 - 0,67 = 0,02999999... ?
Bu sayıların ikili karşılıkları tam sayı değildir, dolayısıyla işlem sonucu "0,03" yerine yaklaşık bir sayı olur: 0,0299999999999999.
2. 0,60 ve 0,57 daha az hata içeriyor olabilir
Bu sayılar da binary sistemde yaklaşık olarak temsil edilir, ama hata miktarı o kadar küçüktür ki 0,03 sonucu tam çıkacak şekilde yuvarlanabilir.
******************************************

İşlem

Gerçek Sonuç

Bilgisayarın Sonucu

0,70 - 0,67

0,0300000000000000

0,0299999999999999 ❌

0,60 - 0,57

0,0300000000000000

0,0300000000000000 ✅

0,50 - 0,47

0,0300000000000000

0,0300000000000000 ✅


Bu tür küçük farklar genellikle YUVARLA fonksiyonu ile çözülür:

=YUVARLA(A1-B1; 2) VEYA =ETOPLA(A1; -B1)

Özetle :
Sorun, sayının binary sistemde tam temsil edilememesi.
Bazı ondalık sayılar daha “uygun” olduğundan sorun çıkarmıyor.
Bu yüzden 0,70 - 0,67 ≠ 0,03 çıkıyor, ama 0,60 - 0,57 = 0,03 çıkıyor.
YUVARLA kullanmak en güvenli yoldur
Açıklamanız için teşekkürler
 
Üst