ทำความเข้าใจการปัดเศษและตำแหน่งทศนิยม
ตำแหน่งทศนิยมหมายถึงตัวเลขที่อยู่ถัดจากจุดทศนิยมของจำนวนหนึ่ง ๆ ตำแหน่งทศนิยมมีความสำคัญเพราะเป็นตัวกำหนดความละเอียดของตัวเลข ยิ่งมีทศนิยมมากก็ยิ่งแม่นยำมาก และในทางกลับกัน
การปัดเลขหมายถึงการปรับจำนวนโดยลดจำนวนตำแหน่งทศนิยม เทคนิคนี้มักใช้เพื่อทำให้ตัวเลขอ่านง่ายขึ้นพร้อมรักษาความสม่ำเสมอในการคำนวณ อย่างไรก็ตาม การปัดเลขให้เหลือทศนิยมจำนวนหนึ่งอาจกระทบความแม่นยำของผลลัพธ์เนื่องจากเกิดข้อผิดพลาดเล็กน้อยจากการปัด
Python มีหลายวิธีในการปัดเลขให้เหลือทศนิยมสองตำแหน่ง ตัวอย่างต่อไปนี้มีคำอธิบายอย่างละเอียดของแต่ละเทคนิค
ใช้ round() เพื่อปัดเลขใน Python
ฟังก์ชัน round() เป็นฟังก์ชันในตัวของ Python สำหรับปัดเลขทศนิยมลอยตัวให้เป็นจำนวนตำแหน่งทศนิยมที่ระบุ สามารถกำหนดจำนวนตำแหน่งทศนิยมได้ด้วยอาร์กิวเมนต์ตัวที่สอง ตัวอย่างด้านล่างจะพิมพ์ 34.15
ฟังก์ชัน round() ของ Python ใช้โหมดปัดค่า "round half to even" เป็นค่าเริ่มต้นเมื่อไม่ระบุอาร์กิวเมนต์ตัวที่สอง การปัดแบบ round half to even (bankers’ rounding) คือเมื่อค่าตรงกึ่งกลางระหว่างจำนวนเต็มสองจำนวน จะปัดไปยังจำนวนเต็มที่เป็นเลขคู่ เทคนิคนี้ช่วยลดข้อผิดพลาดสะสมจากการปัดได้
ข้อควรระวังเรื่องความแม่นยำของ float กับ round()
มีรายละเอียดเล็กน้อยที่ควรรู้ก่อนพึ่งพา round() ในโค้ดการเงิน ลองดูตัวอย่างนี้:
ผลลัพธ์คือ 2.67 ไม่ใช่ 2.68 ค่า 2.675 ไม่สามารถแทนได้อย่างแม่นยำในเลขทศนิยมลอยตัวแบบไบนารี (IEEE 754) ค่าที่เก็บจริงจะน้อยกว่า 2.675 เล็กน้อย จึงถูกปัดลงโดย Python
หากต้องการการปัดที่ตรงเป๊ะสำหรับงานการเงิน ให้ใช้โมดูล decimal พร้อมโหมดการปัดที่ระบุชัดเจน:
ใช้เทคนิคการจัดรูปแบบสตริงเพื่อปัดเลขใน Python
การจัดรูปแบบสตริงมีประโยชน์สำหรับการปัดเลขให้เหลือสองตำแหน่งทศนิยม โดยเฉพาะเมื่อต้องการแสดงผล
โปรดจำไว้ว่าการปัดด้วยการจัดรูปแบบสตริงใน Python จะได้ผลลัพธ์เป็นสตริงเพื่อแสดงผลเท่านั้น แต่ค่าตัวเลขเดิมจะไม่เปลี่ยน หากนำค่าดั้งเดิมไปคำนวณต่อ ผลลัพธ์จะอ้างอิงค่าที่ไม่ถูกปัด ซึ่งอาจทำให้ได้ผลลัพธ์ที่คาดไม่ถึง
ปัดด้วยตัวดำเนินการ %
ตัวดำเนินการ % เป็นวิธีดั้งเดิมในการจัดรูปแบบตัวเลขเป็นสองตำแหน่งทศนิยม โดยแทรกค่าลงในช่องว่างของสตริงที่กำหนดรูปแบบไว้
ในตัวอย่างด้านล่าง f ระบุว่าเป็นตัวเลขทศนิยมลอยตัว ส่วน .2 ระบุจำนวนตำแหน่งทศนิยมที่จะปัด
ปัดด้วย str.format()
เมธอด str.format() มีความยืดหยุ่นมากขึ้นสำหรับกรณีการปัดที่ซับซ้อน เพราะใช้ตัวแทนค่าแบบมีชื่อ นักพัฒนามักนิยมวิธีนี้มากกว่าตัวดำเนินการ % ในตัวอย่างด้านล่าง ใช้ :.2f ภายในวงปีกกาเพื่อระบุว่าปัดเป็นสองตำแหน่งทศนิยม โค้ดจะพิมพ์ 3.14
ปัดด้วย f-strings (Python 3.6+)
f-strings มาตั้งแต่ Python 3.6 และเป็นวิธีที่นิยมที่สุดในการฝังค่าในสตริง ไวยากรณ์ของ f-string เหมาะมากสำหรับการปัด: จัดรูปแบบการแสดงผลได้ในบรรทัดเดียวโดยไม่ต้องเรียกเมธอดแยกต่างหาก โค้ดด้านล่างจะพิมพ์ 14.68
ใช้ format() เพื่อปัดเลขใน Python
ฟังก์ชันในตัว format() รับค่าและสเปคการจัดรูปแบบ แล้วคืนค่าเป็นสตริงที่จัดรูปแบบแล้ว แตกต่างจาก str.format() ตรงที่ส่งตัวเลขเข้าไปโดยตรง ไม่ต้องฝังในสตริงเทมเพลต โค้ดด้านล่างจะพิมพ์ 345.69
ใช้โมดูลอื่นเพื่อปัดเลขใน Python
นอกเหนือจาก Python พื้นฐาน ยังมีโมดูลอื่น ๆ ที่ใช้ปัดเลขได้ จะขอยกตัวอย่างหลักสามอย่าง: math, decimal และ NumPy
ปัดด้วยโมดูล math
โมดูล math ไม่มีฟังก์ชันที่ปัดเลขไปยังตำแหน่งทศนิยมที่กำหนดโดยตรง แต่สามารถผสมผสานกับเลขคณิตอื่นเพื่อปัดเหลือสองตำแหน่งทศนิยมได้
ฟังก์ชัน math.floor() ใช้ปัดลงสู่จำนวนเต็มที่ใกล้ที่สุด หากต้องการปัดลงสองตำแหน่งทศนิยม ให้คูณด้วย 100 ใช้ math.floor() แล้วหารด้วย 100 โค้ดด้านล่างจะพิมพ์ 3.14
ในทำนองเดียวกัน ฟังก์ชัน math.ceil() จะปัดขึ้นสู่จำนวนเต็มที่ใกล้ที่สุด หากต้องการปัดขึ้นสองตำแหน่งทศนิยม ให้คูณด้วย 100 ใช้ math.ceil() แล้วหารด้วย 100 โค้ดด้านล่างจะพิมพ์ 3.15
ปัดด้วยโมดูล decimal
โมดูล decimal ใน Python มีประโยชน์สำหรับการปัดเลขทศนิยมลอยตัวให้ได้ตำแหน่งทศนิยมที่แม่นยำด้วยเมธอด .quantize() ในตัวอย่างด้านล่าง เรากำหนดความละเอียดเป็น 0.01 เพื่อบอกว่าต้องการปัดเป็นสองตำแหน่งทศนิยม
# Import the decimal module
from decimal import Decimal
# Example number to be rounded
number = Decimal("18.73869")
# Define the rounding precision to 2 decimal places
precision = Decimal('0.01')
# Using the quantize method with ROUND_UP
# to round the number up to 2 decimal places
rounded_number = number.quantize(precision)
print(rounded_number)
# 18.74หากกำลังมองหาพฤติกรรมที่ปัดขึ้นโดยเฉพาะ ลองดูบทช่วยสอนล่าสุดของเราเรื่อง How to Round Up a Number in Python เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับการใช้โมดูล math และ decimal และเทคนิคอื่น ๆ เพื่อให้แน่ใจว่าปัดขึ้นเสมอ ไม่ใช่ปัดลง หากอยากเข้าใจการแปลงข้อมูลโดยรวมมากขึ้น ลองเรียนเส้นทางอาชีพ Data Analyst with Python เพื่อพัฒนาทักษะการวิเคราะห์
ปัดด้วย NumPy
เมื่อต้องทำงานกับอาร์เรย์ใน NumPy ให้ใช้ np.round() เพื่อปัดทุกองค์ประกอบในครั้งเดียว เร็วกว่าและอ่านง่ายกว่าการวนลูปด้วยตนเอง
np.round() ใช้กฎการปัดแบบ banker's rounding เช่นเดียวกับ round() ในตัวของ Python เมธอด .round() ทำงานแบบเดียวกันบน DataFrame และ Series ของ pandas:
หากต้องการภาพรวมกว้าง ๆ ของการแปลงข้อมูลด้วย pandas ดูที่ pandas tutorial ของเรา
ควรใช้วิธีปัดของ Python แบบใดเมื่อไร
สรุปสั้น ๆ สำหรับการเลือกวิธีปัดที่เหมาะสม:
| วิธี | เหมาะสำหรับ | เปลี่ยนค่าเดิมหรือไม่ | ชนิดผลลัพธ์ |
|---|---|---|---|
round(x, 2) | คณิตศาสตร์ทั่วไป | ใช่ | float |
f"{x:.2f}" | การแสดงผล / พิมพ์ | ไม่ | str |
str.format() | การแสดงผล / พิมพ์ | ไม่ | str |
% operator | การแสดงผล / พิมพ์ (แบบเดิม) | ไม่ | str |
format(x, ".2f") | การแสดงผล / ค่าตัวเดียว | ไม่ | str |
math.floor() / ceil() | ปัดลงเสมอ / ปัดขึ้นเสมอ | ใช่ | float |
Decimal.quantize() | การเงิน / ทศนิยมตรงเป๊ะ | ใช่ | Decimal |
np.round(arr, 2) | อาร์เรย์ NumPy | ใช่ | ndarray |
กฎจำง่าย ๆ เพื่อช่วยในการเลือก:
-
ต้องการแค่แสดงตัวเลข? ใช้ f-string (
f"{x:.2f}") โค้ดบรรทัดเดียว ไม่ต้อง import และไม่กระทบค่าดั้งเดิม -
จะคำนวณต่อด้วยผลลัพธ์? ใช้
round(x, 2)จะได้ float สำหรับนำไปคำนวณต่อ -
โค้ดการเงินหรือบัญชี? ใช้
Decimal.quantize()ปัญหาความแม่นยำของ float (round(2.675, 2) == 2.67) จะไม่เกิดกับโมดูลdecimal -
ต้องปัดขึ้นเสมอหรือปัดลงเสมอ? ใช้
math.ceil()หรือmath.floor()ซึ่งไม่ยึดตามกฎการปัดทั่วไป -
ทำงานกับอาร์เรย์ NumPy หรือคอลัมน์ pandas? ใช้
np.round(arr, 2)หรือseries.round(2)จัดการทั้งชุดข้อมูลในครั้งเดียว -
ดูแลโค้ดเก่า? ตัวดำเนินการ
%ยังใช้ได้ แต่ f-strings มาแทนตั้งแต่ Python 3.6 แล้ว ควรใช้ในโค้ดใหม่
ข้อคิดส่งท้าย
การปัดเลขให้เหลือทศนิยมสองตำแหน่งเป็นเทคนิคสำคัญเพื่อความแม่นยำที่เหมาะสมในงานคำนวณทางการเงินและวิทยาศาสตร์ บทความนี้ได้กล่าวถึงหลายวิธีในการปัด รวมถึงฟังก์ชันในตัว เทคนิคจัดรูปแบบสตริง และโมดูล math ควรทำความเข้าใจและเลือกใช้วิธีที่เหมาะสมตามความต้องการ เช่น ระดับความแม่นยำและรูปแบบการแสดงผล ขอแนะนำให้ฝึกใช้แต่ละวิธีกับตัวอย่างหลากหลาย เพื่อมองเห็นวิธีที่เหมาะกับงานของตน
หากอยากยกระดับทักษะ Python ลองดูเส้นทางทักษะ Python Programming ที่ครอบคลุมฟังก์ชัน เดคอเรเตอร์ และแพตเทิร์นขั้นสูง อีกทั้งเส้นทางอาชีพ Python Developer ก็ออกแบบมาเพื่อเสริมทักษะการพัฒนา พร้อมเรียนรู้โครงสร้างข้อมูลและอัลกอริทึมขั้นสูง
คำถามที่พบบ่อย
วิธีที่ง่ายที่สุดในการปัดเลขเป็นสองตำแหน่งทศนิยมใน Python คืออะไร?
วิธีที่ง่ายที่สุดในการปัดเลขให้เหลือสองตำแหน่งทศนิยมคือใช้ฟังก์ชันในตัว round()
ทำไมตัวเลขจึงถูกปัดเป็นจำนวนเต็มที่ใกล้ที่สุดเมื่อใช้ฟังก์ชัน round()?
วิธีปัดเริ่มต้นของฟังก์ชัน round() คือ round half to even หากต้องการปัดเป็นสองตำแหน่งทศนิยม ต้องระบุอาร์กิวเมนต์ตัวที่สองเป็น 2 เช่น round(3.14159, 2)
ใช้ฟังก์ชัน format() อย่างไรในการปัดเลขเป็นสองตำแหน่งทศนิยม?
ฟังก์ชัน format() ใช้สำหรับปัดเลขให้เป็นจำนวนตำแหน่งทศนิยมที่ระบุและแสดงภายในสตริงที่จัดรูปแบบ
round half to even คืออะไร?
วิธีปัดแบบ round half to even หรือ bankers’ rounding คือการปัดค่าที่อยู่กึ่งกลางพอดีระหว่างจำนวนเต็มสองจำนวนไปยังจำนวนเต็มที่เป็นเลขคู่
โมดูล math มีฟังก์ชันปัดเลขเป็นสองตำแหน่งทศนิยมใน Python หรือไม่?
สามารถใช้ math.floor() และ math.ceil() ร่วมกับการคำนวณอื่น เพื่อปัดเลขให้เหลือตำแหน่งทศนิยมตามที่ต้องการได้เท่านั้น
ทำไม round(2.675, 2) จึงได้ 2.67 แทนที่จะเป็น 2.68?
นี่เป็นประเด็นเรื่องความแม่นยำของเลขทศนิยมลอยตัว ค่า 2.675 ไม่สามารถแทนได้อย่างแม่นยำในเลขทศนิยมลอยตัวแบบไบนารี (IEEE 754); ค่าที่เก็บจริงจะน้อยกว่า 2.675 เล็กน้อย จึงถูกปัดลงเป็น 2.67 โดย Python
เพื่อหลีกเลี่ยงปัญหานี้ในโค้ดการเงิน ให้ใช้โมดูล decimal พร้อมโหมดการปัดที่ระบุชัดเจน: Decimal("2.675").quantize(Decimal("0.01"), rounding=ROUND_HALF_UP) จะได้ผลลัพธ์เป็น 2.68 ตามที่คาด
จะปัดค่าทั้งหมดใน pandas DataFrame ให้เหลือ 2 ตำแหน่งทศนิยมได้อย่างไร?
ใช้เมธอด .round() กับ DataFrame หรือ Series หากต้องการปัดคอลัมน์เดียว: df["price"] = df["price"].round(2) หากต้องการปัดทุกคอลัมน์ที่เป็นตัวเลขในครั้งเดียว: df = df.round(2).
การปัดเลขให้เหลือทศนิยมสองตำแหน่งเป็นเทคนิคสำคัญใน Python โดยเฉพาะอย่างยิ่งในงานคำนวณทางการเงิน การนำเสนอข้อมูล และการรายงานทางวิทยาศาสตร์
Python มีหลายวิธีสำหรับการปัดเลขอย่างแม่นยำ ในบทช่วยสอนนี้ จะแสดงวิธีปัดเลขเป็นทศนิยมสองตำแหน่งใน Python โดยใช้ฟังก์ชันในตัว ไลบรารี และวิธีจัดรูปแบบสตริง
หากเพิ่งเริ่มต้นสายงานนักวิเคราะห์ข้อมูล ขอแนะนำคอร์ส Introduction to Python ของ DataCamp เพื่อเรียนพื้นฐาน Python สำหรับการจัดการและแปลงข้อมูล และบทความ Python NumPy tutorial ของเราก็มีประโยชน์ หากต้องปัดอาร์เรย์ตัวเลขขนาดใหญ่ในการทำงานวิเคราะห์ข้อมูล
สรุปสั้น ๆ
ใช้
round(number, 2)สำหรับการปัดเชิงคณิตศาสตร์ — ค่าจริงจะเปลี่ยนไปใช้
f"{number:.2f}"หรือstr.format()เพื่อแสดงผลเท่านั้น — ค่า float เดิมไม่เปลี่ยนใช้โมดูล
decimalเมื่อต้องการความแม่นยำแบบทศนิยมที่ตรงเป๊ะ (เช่น การคำนวณทางการเงิน)ใช้
np.round(array, 2)เพื่อปัดทั้งอาร์เรย์ของ NumPy ในครั้งเดียวระวังความแม่นยำของ float:
round(2.675, 2)จะได้2.67ไม่ใช่2.68เนื่องจากวิธีเก็บ float ในหน่วยความจำ