C++:
การปัดเศษของตัวเลข
วิธีการ:
C++ เสนอวิธีการปัดเศษตัวเลขหลายวิธี เช่น floor()
, ceil()
, และ round()
:
#include <iostream>
#include <cmath> // สำหรับฟังก์ชันการปัดเศษ
int main() {
double num = 3.14;
std::cout << "floor: " << std::floor(num) << "\n"; // ผลลัพธ์: floor: 3
std::cout << "ceil: " << std::ceil(num) << "\n"; // ผลลัพธ์: ceil: 4
std::cout << "round: " << std::round(num) << "\n"; // ผลลัพธ์: round: 3
// สำหรับความแม่นยำที่ตายตัว เช่น การปัดเศษไปเป็นสองทศนิยม:
double precise_num = 3.146;
double multiplier = 100.0;
double rounded = std::round(precise_num * multiplier) / multiplier;
std::cout << "rounded to two decimals: " << rounded << "\n"; // ผลลัพธ์: rounded to two decimals: 3.15
return 0;
}
ลงลึก
ก่อน C++11, การปัดเศษขึ้นอาศัยเทคนิคแบบดั้งเดิมหรือไลบรารี่ที่ไม่เป็นมาตรฐาน ในปัจจุบัน, <cmath>
ให้วิธีการที่มั่นคง floor()
ปัดลง, ceil()
ปัดขึ้น, ขณะที่ round()
ไปที่จำนวนเต็มที่ใกล้ที่สุด, แม้แต่การจัดการกับกรณีการตัดสินใจ (กรณี 0.5) โดยปัดไปที่จำนวนคู่
การเข้าใจพฤติกรรมของฟังก์ชันเหล่านี้เป็นสิ่งสำคัญ เช่น ตัวเลขลบอาจทำให้คุณตกใจ (std::round(-2.5)
ให้ผลลัพธ์ -2.0
)
มีทางเลือกอื่นไหม? การแปลงเป็น int หลังจากที่เพิ่ม 0.5 สำหรับตัวเลขบวกเป็นเทคนิคแบบคลาสสิก แต่ผิดพลาดกับตัวเลขลบและไม่มีความเป็นกลางทางประเภท ไลบรารีเช่น Boost สามารถเสนอวิธีการที่มีความละเอียดอ่อนมากขึ้น ขณะที่ส่วนขยายภาษาหรือ intrinsic ของตัวแปลสามารถปรับให้เหมาะสมกับฮาร์ดแวร์เฉพาะได้
ดูเพิ่มเติม
- อ้างอิง C++ สำหรับ
<cmath>
: https://en.cppreference.com/w/cpp/header/cmath - มาตรฐาน IEEE สำหรับการคำนวณจุดลอยตัว (IEEE 754): https://ieeexplore.ieee.org/document/4610935
- ไลบรารีการแปลงตัวเลขของ Boost: https://www.boost.org/doc/libs/release/libs/numeric/conversion/