Haskell:
การปัดเศษของตัวเลข
วิธีการ:
Haskell ใช้ฟังก์ชั่น round
, ceiling
, floor
, และ truncate
จาก Prelude
สำหรับการปัดเศษ
import Prelude
main :: IO ()
main = do
let num = 3.567
print $ round num -- 4
print $ ceiling num -- 4
print $ floor num -- 3
print $ truncate num -- 3
-- การปัดเศษไปยังทศนิยมที่เฉพาะเจาะจงไม่ใช่ส่วนหนึ่งของ Prelude
-- นี่คือฟังก์ชันที่กำหนดเอง:
let roundTo n f = (fromInteger $ round $ f * (10^n)) / (10.0^^n)
print $ roundTo 1 num -- 3.6
การศึกษาลึก
ในอดีต, การปัดเศษมีความสำคัญในการวิเคราะห์เชิงตัวเลขและวิทยาการคอมพิวเตอร์ เพราะเป็นสิ่งที่สำคัญในการลดการสะสมข้อผิดพลาดในการคำนวณ โดยเฉพาะก่อนที่การแทนค่าจุดลอยตัวจะมีการมาตรฐานสากลตาม IEEE 754
ควรปัดเศษไปยังอะไร? round
จะนำคุณไปยังจำนวนเต็มที่ใกล้ที่สุด—ขึ้นหรือลง ceiling
และ floor
จะปัดเศษขึ้นหรือลงไปยังจำนวนเต็มที่ใกล้ที่สุดตามลำดับ ขณะที่ truncate
เพียงแค่ตัดทศนิยมทิ้ง
ตัวเลือกอื่นๆ นอกเหนือจากฟังก์ชันเหล่านี้อาจเกี่ยวข้องกับตรรกะที่กำหนดเอง เช่น roundTo
ของเรา หรือคุณอาจใช้ไลบรารี (เช่น Data.Fixed) สำหรับความต้องการที่ซับซ้อนมากขึ้น
ระวังผลลัพธ์ที่ไม่คาดคิดเนื่องจากวิธีที่ Haskell จัดการกับกรณีครึ่งทางใน round
(มันปัดเศษไปยังจำนวนคู่ที่ใกล้ที่สุด)
ดูเพิ่มเติม
- เอกสารของ Haskell Prelude สำหรับฟังก์ชั่นการปัดเศษ: https://hackage.haskell.org/package/base-4.16.1.0/docs/Prelude.html
- Haskell Wiki เกี่ยวกับคณิตศาสตร์จุดลอยตัว: https://wiki.haskell.org/Floating_point_arithmetic
- มาตรฐาน IEEE 754-2008 สำหรับข้อมูลเพิ่มเติมว่าการแทนค่าจุดลอยตัวจัดการอย่างไรในหลายภาษา: https://ieeexplore.ieee.org/document/4610935