Dua kasus umum untuk dipertimbangkan:
Aritmatika integer
Tentunya jika Anda menggunakan bilangan bulat aritmatika (yang memotong) Anda akan mendapatkan hasil yang berbeda. Berikut ini contoh kecil dalam C #:
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.");
}
}
Keluaran:
First comparison says it's not bigger.
Second comparison says it's bigger.
Aritmatika titik mengambang
Selain dari fakta bahwa pembagian dapat menghasilkan hasil yang berbeda ketika membagi dengan nol (itu menghasilkan pengecualian, sedangkan perkalian tidak), itu juga dapat mengakibatkan kesalahan pembulatan yang sedikit berbeda dan hasil yang berbeda. Contoh sederhana dalam C #:
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.");
}
}
Keluaran:
First comparison says it's not bigger.
Second comparison says it's bigger.
Jika Anda tidak percaya kepada saya, ini adalah Fiddle yang bisa Anda eksekusi dan lihat sendiri.
Bahasa lain mungkin berbeda; ingatlah, bagaimanapun, bahwa C #, seperti banyak bahasa, mengimplementasikan pustaka titik mengambang standar IEEE (IEEE 754) , jadi Anda harus mendapatkan hasil yang sama di waktu run standar lainnya.
Kesimpulan
Jika Anda bekerja greenfield , Anda mungkin baik-baik saja.
Jika Anda bekerja pada kode lawas, dan aplikasi tersebut adalah aplikasi keuangan atau sensitif lainnya yang melakukan aritmatika dan diharuskan untuk memberikan hasil yang konsisten, sangat berhati-hati ketika mengubah sekitar operasi. Jika Anda harus, pastikan bahwa Anda memiliki unit test yang akan mendeteksi setiap perubahan aritmatika.
Jika Anda hanya melakukan hal-hal seperti menghitung elemen dalam array atau fungsi komputasi umum lainnya, Anda mungkin akan baik-baik saja. Saya tidak yakin metode multiplikasi membuat kode Anda lebih jelas.
Jika Anda menerapkan algoritme ke spesifikasi, saya tidak akan mengubah apa pun, tidak hanya karena masalah kesalahan pembulatan, tetapi agar pengembang dapat meninjau kode dan memetakan setiap ekspresi kembali ke spesifikasi untuk memastikan tidak ada implementasi kekurangan.
oldValue >= 0
?