คำเตือน: นี่ไม่ใช่ทางแก้ที่ดีที่สุด อย่ายึดติดนะครับ ลองพยายามหาวิธีที่ดีกว่าเนอะ (ผมก็พยายามเช่นกัน)
การคำนวนเกี่ยวกับทศนิยมนั้น
การแสดงผล อาจจะไม่ใช่ค่าที่แท้จริงก็เป็นได้
3.74166 อาจจะเกิดจากค่าจริงที่เป็น 3.741657313256…. (ทศนิยมไม่รู้จบ)
ดังนั้น การเอาตัวแปร float (ทศนิยม) มาตรวจสอบว่า เท่ากันหรือไม่
อาจจะได้ผลเป็น ไม่เท่ากัน ไม่สอดคล้องกับที่ตาเห็น ก็เป็นได้
float expect = 3.74166;
ASSERT_THAT(2.50710f + 1.23456f, testing::Eq(expect));
โค้ดตัวอย่างด้านบนนี้ จะได้ผล Test เป็นผ่าน เพราะเนื่องจาก ผลจากการบวกเกิดจากตัวแปรประเภท float ที่มีทศนิยมจำกัด ทั้งคู่นั่นเอง
แล้วทีนี้เราจะทำอย่างไรล่ะ
ถ้าเกิดเหตุที่ผลลัพธ์ที่เอามาทดสอบ
เกิดเป็นทศนิยมไม่รู้จบขึ้นมา
ผมก็ได้ลองไปเรื่อยๆ จนมาพบเอาว่า
“ก็แปลงเป็น string สิ เลือกจำนวนหลักหลังจุดที่ต้องการได้ด้วย”
หน้าตาของ test ที่ได้ก็จะเป็นดังนี้
TEST_F(ThreeDDistanceTest, TestExampleValueSet3){
int point1[3] = {1,2,3};
int point2[3] = {7,-4,5};
float expect = 8.7178;
float actual = pSolver->GetDist3(point1[0], point1[1], point1[2],
point2[0], point2[1], point2[2]);
char buffer[32];
sprintf(buffer, "%.5f", expect);
string expectString = buffer;
sprintf(buffer, "%.5f", actual);
string actualString = buffer;
ASSERT_THAT(actualString, testing::Eq(expectString));
}
ผลลัพธ์ที่ได้ ออกมาเป็นที่หน้าพอใจ (แต่ไม่ดีที่สุด) ครับ