Excel - Bu eşitlik kontrolü neden başarısız oluyor?


1

Alınan banka hesap özetlerini kontrol etmek için Excel kullanıyorum. Kullandığım testlerden biri, bakiye sütununun önceki bakiye ile satır tutarına eşit olduğundan emin olmak. Şimdiye kadar her koşulda işe yaradı, ancak bu belirli değerler kümesiyle başarısız gözüküyor:

Eşitlik kontrolü başarısız

Hücre içeriği aşağıdaki gibidir:

A1: 11474.97
A2: -10781.34
A3: =A1+A2
A4: 693.63
A5: =A3=A4

Office 16.0.6965.2117 kullanıyorum. Bu bir hata mı, yoksa eşitlik operatörünün nasıl çalıştığıyla ilgili temel bir şeyi mi özlüyorum?


A3 ve A4 hücrelerini görünüşte herhangi bir değerle çarpıp eşitlik kontrolünü yaparsam çalışır.
rudivonstaden

Kullanmak daha iyidir = (A3 = A4, "Tamam", "Farklı")
yass

Bu formül aynı zamanda farklı çıkageldi - eşitlik denetimi başarısız
rudivonstaden

2
Excel A1 veya A2 girişleri metin değildir, ancak formül girişleri sonra A3 için "693,63" gibi farklı göreceksiniz excel "693.630000001" olabilir eğer sayılar yapma eğilimindedirler
Kevin Anthony Oppegaard Gül

1
@KevinAnthonyOppegaardRose doğru. Sayı biçimini 30 ondalık basamakla değiştirmeyi denedim ve A3'te 693.629999999999000000000000000000’ü, A4’de 693.6300000000000000000000000000
Darius

Yanıtlar:


2

Başlangıç ​​sayıları sonuçtan çok daha büyük olduğundan, IEEE 754 kayan nokta aritmetiği nedeniyle hassasiyet kaybıyla karşılaşacaksınız . Excel, IEEE 754 Çift Hassasiyet kullanır .

Ayrıntılara girmeyeceğim ama bunun yerine sorunu açıklayacağım. Öncelikle, tüm sayıları IEEE 754'e çevirelim:

  11474.97 ≙ 0 1000000 1100 0110 01101001 01111100 00101000 11110101 11000010 10001111

... 0 işaret ( 0 ), 10000001100 üstel ve geri kalanı mantis.

-10781.34 ≙ 1 1000000 1100 0101 00001110 10101011 10000101 00011110 10111000 01010010
    693.63 ≙ 0 1000000 1000 0101 10101101 00001010 00111101 01110000 10100011 11010111

Gördüğünüz gibi, büyük sayılar aynı üsse sahip oluyor. Üst kısım ne kadar büyük olursa, kaydedilen sayı o kadar az kesindir:

  11474.97 → 11474.9699999999993451638147235
 -10781.34 → -10781.340000000000001455191522837
    693.63 → 693.62999999999999995452526491135

Hizalanmış sayılardan zaten görebileceğiniz gibi, 693.63'ün saklanma şekli daha kesindir.

Yani, sayıları ekleme sonucu:

0 1000000 1000 0101 10101101 00001010 00111101 01110000 10100011 11010000

Tekrar karşılaştıralım:

0 1000000 1000 0101 10101101 00001010 00111101 01110000 10100011 11010000 - Sonuç
 0 1000000 1000 0101 10101101 00001010 00111101 01110000 10100011 11010111 - Sabit

Yani, tamamen aynı değil. Kayan nokta sayılarını her zaman bir toleransla karşılaştırmalısınız. Bunun gibi, böyle:

abs(a - b) < 0.000000001

Teknik detayı eklediğiniz için teşekkür ederiz. Bu cevabı kabul etmek, çünkü çok kapsamlı ve eşitlik karşılaştırmalarına tolerans yaklaşımının basitçe yuvarlamadan daha doğru olduğunu düşünüyorum.
rudivonstaden

1

Neden yaptığını bilmiyorum ama Office 2010 kullanıyorum ve aynı sorunu alıyorum.

Etrafı aşmak için A5'i değiştirdim = ROUND (A3, 2) = ROUND (A4, 2). Bu problemi düzeltti, böylece hataya neden olan mini miktarların kesirleriyle ilgili bir tür küçük sorun olduğunu varsayabilirim.

Ve, @yass yorumlarda belirtildiği gibi, bir IF ifadesi kullanmak daha iyi çalışacak ve bu durumda sizin için işleri daha temiz tutacaktır, ancak bu durumda% 100 gerekli değil.


Teşekkürler Stephen. Aslında koşullu biçimlendirme için kullanıyorum, bu durumda IF ifadesi gereksizdir.
rudivonstaden
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.