Hai trường hợp phổ biến để xem xét:
Số nguyên
Rõ ràng nếu bạn đang sử dụng số học số nguyên (cắt ngắn), bạn sẽ nhận được một kết quả khác. Đây là một ví dụ nhỏ trong 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.");
}
}
Đầu ra:
First comparison says it's not bigger.
Second comparison says it's bigger.
Số học dấu phẩy động
Ngoài việc phân chia có thể mang lại một kết quả khác khi nó chia cho 0 (nó tạo ra một ngoại lệ, trong khi phép nhân không), nó cũng có thể dẫn đến các lỗi làm tròn hơi khác nhau và kết quả khác nhau. Ví dụ đơn giản trong 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.");
}
}
Đầu ra:
First comparison says it's not bigger.
Second comparison says it's bigger.
Trong trường hợp bạn không tin tôi, đây là một Fiddle mà bạn có thể tự mình thực hiện và xem.
Các ngôn ngữ khác có thể khác nhau; Tuy nhiên, hãy nhớ rằng C #, giống như nhiều ngôn ngữ, triển khai thư viện dấu phẩy động chuẩn (IEEE 754) , do đó bạn sẽ nhận được kết quả tương tự trong các lần chạy chuẩn hóa khác.
Phần kết luận
Nếu bạn đang làm việc trên cánh đồng xanh , có lẽ bạn vẫn ổn.
Nếu bạn đang làm việc với mã kế thừa và ứng dụng là một ứng dụng tài chính hoặc nhạy cảm khác thực hiện số học và được yêu cầu cung cấp kết quả nhất quán, hãy thận trọng khi thay đổi xung quanh các hoạt động. Nếu bạn phải, hãy chắc chắn rằng bạn có các bài kiểm tra đơn vị sẽ phát hiện bất kỳ thay đổi tinh tế nào trong số học.
Nếu bạn chỉ làm những việc như đếm các phần tử trong một mảng hoặc các hàm tính toán chung khác, có lẽ bạn sẽ ổn. Tuy nhiên, tôi không chắc phương thức nhân làm cho mã của bạn rõ ràng hơn.
Nếu bạn đang triển khai thuật toán cho một đặc tả, tôi sẽ không thay đổi gì cả, không chỉ vì vấn đề làm tròn lỗi, mà để các nhà phát triển có thể xem lại mã và ánh xạ từng biểu thức trở lại đặc tả để đảm bảo không có triển khai sai sót.
oldValue >= 0
?