สองกรณีทั่วไปที่ควรพิจารณา:
เลขจำนวนเต็ม
เห็นได้ชัดว่าหากคุณใช้เลขคณิตเลขจำนวนเต็ม (ซึ่งตัดปลาย) คุณจะได้รับผลลัพธ์ที่แตกต่างกัน นี่คือตัวอย่างเล็ก ๆ ใน 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.");
}
}
เอาท์พุท:
First comparison says it's not bigger.
Second comparison says it's bigger.
เลขทศนิยม
นอกเหนือจากความจริงที่ว่าการหารสามารถให้ผลลัพธ์ที่แตกต่างกันเมื่อมันหารด้วยศูนย์ (มันสร้างข้อยกเว้นในขณะที่การคูณไม่ได้) มันยังสามารถส่งผลให้เกิดข้อผิดพลาดในการปัดเศษที่แตกต่างกันเล็กน้อย ตัวอย่างง่าย ๆ ใน 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.");
}
}
เอาท์พุท:
First comparison says it's not bigger.
Second comparison says it's bigger.
ในกรณีที่คุณไม่เชื่อฉันนี่คือซอที่คุณสามารถปฏิบัติและดูด้วยตัวคุณเอง
ภาษาอื่นอาจแตกต่างกัน โปรดจำไว้ว่า C # เช่นหลายภาษาใช้ไลบรารีจุดลอยตัวมาตรฐาน IEEE (IEEE 754)ดังนั้นคุณควรได้รับผลลัพธ์เดียวกันในเวลารันมาตรฐานอื่น ๆ
ข้อสรุป
หากคุณกำลังทำงานกรีนฟิลด์คุณอาจจะโอเค
หากคุณกำลังทำงานกับรหัสดั้งเดิมและแอปพลิเคชันเป็นแอปพลิเคชั่นทางการเงินหรืออื่น ๆ ที่มีความละเอียดอ่อนซึ่งดำเนินการทางคณิตศาสตร์และจำเป็นต้องให้ผลลัพธ์ที่สอดคล้องกันให้ระมัดระวังเป็นอย่างมาก หากคุณต้องตรวจสอบให้แน่ใจว่าคุณมีการทดสอบหน่วยที่จะตรวจจับการเปลี่ยนแปลงเล็กน้อยในคณิตศาสตร์
หากคุณเพียงแค่ทำสิ่งต่าง ๆ เช่นการนับองค์ประกอบในอาร์เรย์หรือฟังก์ชั่นการคำนวณทั่วไปอื่น ๆ คุณอาจจะตกลง ฉันไม่แน่ใจว่าวิธีการคูณทำให้รหัสของคุณชัดเจนขึ้น
หากคุณใช้อัลกอริทึมกับสเปคฉันจะไม่เปลี่ยนแปลงอะไรเลยไม่ใช่เพียงเพราะปัญหาการปัดเศษข้อผิดพลาด แต่เพื่อให้นักพัฒนาสามารถตรวจสอบรหัสและแมปนิพจน์แต่ละตัวกลับไปสเปคเพื่อให้แน่ใจว่าไม่มีการใช้งาน ข้อบกพร่อง.
oldValue >= 0
หรือไม่