Dikkate alınması gereken iki genel durum:
Tamsayılı aritmetik
Açıkçası tamsayı aritmetiği kullanıyorsanız (ki bu kısalır) farklı bir sonuç alırsınız. İşte C # küçük bir örnek:
public static void TestIntegerArithmetic()
{
int newValue = 101;
int oldValue = 10;
int SOME_CONSTANT = 10;
if(newValue / oldValue > SOME_CONSTANT)
{
Console.WriteLine("First comparison says it's bigger.");
}
else
{
Console.WriteLine("First comparison says it's not bigger.");
}
if(newValue > oldValue * SOME_CONSTANT)
{
Console.WriteLine("Second comparison says it's bigger.");
}
else
{
Console.WriteLine("Second comparison says it's not bigger.");
}
}
Çıktı:
First comparison says it's not bigger.
Second comparison says it's bigger.
Kayan nokta aritmetiği
Bölünmenin sıfıra böldüğü zaman farklı bir sonuç verebilmesi (bir istisna oluşturur, oysa çarpma yapmaz) dışında, aynı zamanda biraz farklı yuvarlama hataları ve farklı bir sonuçla sonuçlanabilir. C # 'daki basit örnek:
public static void TestFloatingPoint()
{
double newValue = 1;
double oldValue = 3;
double SOME_CONSTANT = 0.33333333333333335;
if(newValue / oldValue >= SOME_CONSTANT)
{
Console.WriteLine("First comparison says it's bigger.");
}
else
{
Console.WriteLine("First comparison says it's not bigger.");
}
if(newValue >= oldValue * SOME_CONSTANT)
{
Console.WriteLine("Second comparison says it's bigger.");
}
else
{
Console.WriteLine("Second comparison says it's not bigger.");
}
}
Çıktı:
First comparison says it's not bigger.
Second comparison says it's bigger.
Bana inanmamanız durumunda işte kendiniz uygulayabileceğiniz ve görebileceğiniz bir Keman .
Diğer diller farklı olabilir; Bununla birlikte, birçok dilde olduğu gibi C # 'nın da bir IEEE standardı (IEEE 754) kayan nokta kitaplığı uyguladığını , bu nedenle diğer standartlaştırılmış çalışma zamanlarında aynı sonuçları almanız gerektiğini unutmayın.
Sonuç
Yeşil tarlada çalışıyorsanız , muhtemelen sorun değil.
Eski kod üzerinde çalışıyorsanız ve uygulama aritmetik işlem yapan ve tutarlı sonuçlar sağlamak için gereken finansal veya diğer hassas bir uygulama ise, işlemleri değiştirirken çok dikkatli olun. Gerekirse, aritmetikteki ince değişiklikleri tespit edecek birim testler yaptığınızdan emin olun.
Yalnızca bir dizideki öğeleri sayma veya diğer genel işlemsel işlevler gibi şeyler yapıyorsanız, muhtemelen iyi olacaksınız. Çarpma yönteminin kodunuzu daha netleştirdiğinden emin değilim.
Bir şartnameye bir algoritma uyguluyorsanız, yalnızca yuvarlama hataları nedeniyle değil, hiçbir şeyi değiştirmeyeceğim, ancak geliştiricilerin kodu gözden geçirip herhangi bir ifadenin uygulanmamasını sağlamak için her bir ifadeyi tekrar belirtime eşleyebilirler. kusurları.
oldValue >= 0
misin?