Courses
การปัดเลขให้เหลือทศนิยมสองตำแหน่งเป็นเทคนิคสำคัญใน 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 ในหน่วยความจำ
ทำความเข้าใจการปัดเศษและตำแหน่งทศนิยม
ตำแหน่งทศนิยมหมายถึงตัวเลขที่อยู่ถัดจากจุดทศนิยมของจำนวนหนึ่ง ๆ ตำแหน่งทศนิยมมีความสำคัญเพราะเป็นตัวกำหนดความละเอียดของตัวเลข ยิ่งมีทศนิยมมากก็ยิ่งแม่นยำมาก และในทางกลับกัน
การปัดเลขหมายถึงการปรับจำนวนโดยลดจำนวนตำแหน่งทศนิยม เทคนิคนี้มักใช้เพื่อทำให้ตัวเลขอ่านง่ายขึ้นพร้อมรักษาความสม่ำเสมอในการคำนวณ อย่างไรก็ตาม การปัดเลขให้เหลือทศนิยมจำนวนหนึ่งอาจกระทบความแม่นยำของผลลัพธ์เนื่องจากเกิดข้อผิดพลาดเล็กน้อยจากการปัด
Python มีหลายวิธีในการปัดเลขให้เหลือทศนิยมสองตำแหน่ง ตัวอย่างต่อไปนี้มีคำอธิบายอย่างละเอียดของแต่ละเทคนิค
ใช้ round() เพื่อปัดเลขใน Python
ฟังก์ชัน round() เป็นฟังก์ชันในตัวของ Python สำหรับปัดเลขทศนิยมลอยตัวให้เป็นจำนวนตำแหน่งทศนิยมที่ระบุ สามารถกำหนดจำนวนตำแหน่งทศนิยมได้ด้วยอาร์กิวเมนต์ตัวที่สอง ตัวอย่างด้านล่างจะพิมพ์ 34.15
# Example number to be rounded
number = 34.14559
# Rounding the number to 2 decimal places
rounded_number = round(number, 2)
print(rounded_number)
# 34.15
ฟังก์ชัน round() ของ Python ใช้โหมดปัดค่า "round half to even" เป็นค่าเริ่มต้นเมื่อไม่ระบุอาร์กิวเมนต์ตัวที่สอง การปัดแบบ round half to even (bankers’ rounding) คือเมื่อค่าตรงกึ่งกลางระหว่างจำนวนเต็มสองจำนวน จะปัดไปยังจำนวนเต็มที่เป็นเลขคู่ เทคนิคนี้ช่วยลดข้อผิดพลาดสะสมจากการปัดได้
ข้อควรระวังเรื่องความแม่นยำของ float กับ round()
มีรายละเอียดเล็กน้อยที่ควรรู้ก่อนพึ่งพา round() ในโค้ดการเงิน ลองดูตัวอย่างนี้:
print(round(2.675, 2)) # You might expect 2.68
# Output: 2.67
ผลลัพธ์คือ 2.67 ไม่ใช่ 2.68 ค่า 2.675 ไม่สามารถแทนได้อย่างแม่นยำในเลขทศนิยมลอยตัวแบบไบนารี (IEEE 754) ค่าที่เก็บจริงจะน้อยกว่า 2.675 เล็กน้อย จึงถูกปัดลงโดย Python
หากต้องการการปัดที่ตรงเป๊ะสำหรับงานการเงิน ให้ใช้โมดูล decimal พร้อมโหมดการปัดที่ระบุชัดเจน:
from decimal import Decimal, ROUND_HALF_UP
result = Decimal("2.675").quantize(Decimal("0.01"), rounding=ROUND_HALF_UP)
print(result) # 2.68
ใช้เทคนิคการจัดรูปแบบสตริงเพื่อปัดเลขใน Python
การจัดรูปแบบสตริงมีประโยชน์สำหรับการปัดเลขให้เหลือสองตำแหน่งทศนิยม โดยเฉพาะเมื่อต้องการแสดงผล
โปรดจำไว้ว่าการปัดด้วยการจัดรูปแบบสตริงใน Python จะได้ผลลัพธ์เป็นสตริงเพื่อแสดงผลเท่านั้น แต่ค่าตัวเลขเดิมจะไม่เปลี่ยน หากนำค่าดั้งเดิมไปคำนวณต่อ ผลลัพธ์จะอ้างอิงค่าที่ไม่ถูกปัด ซึ่งอาจทำให้ได้ผลลัพธ์ที่คาดไม่ถึง
ปัดด้วยตัวดำเนินการ %
ตัวดำเนินการ % เป็นวิธีดั้งเดิมในการจัดรูปแบบตัวเลขเป็นสองตำแหน่งทศนิยม โดยแทรกค่าลงในช่องว่างของสตริงที่กำหนดรูปแบบไว้
ในตัวอย่างด้านล่าง f ระบุว่าเป็นตัวเลขทศนิยมลอยตัว ส่วน .2 ระบุจำนวนตำแหน่งทศนิยมที่จะปัด
# Example number to be rounded
number = 3.14159
# Using the % operator to round to 2 decimal places
formatted_number = "%.2f" % number
print(formatted_number)
# 3.14
ปัดด้วย str.format()
เมธอด str.format() มีความยืดหยุ่นมากขึ้นสำหรับกรณีการปัดที่ซับซ้อน เพราะใช้ตัวแทนค่าแบบมีชื่อ นักพัฒนามักนิยมวิธีนี้มากกว่าตัวดำเนินการ % ในตัวอย่างด้านล่าง ใช้ :.2f ภายในวงปีกกาเพื่อระบุว่าปัดเป็นสองตำแหน่งทศนิยม โค้ดจะพิมพ์ 3.14
# Example number to be rounded
number = 3.14159
# Using str.format() to round to 2 decimal places
formatted_number = "{:.2f}".format(number)
print(formatted_number)
# 3.14
ปัดด้วย f-strings (Python 3.6+)
f-strings มาตั้งแต่ Python 3.6 และเป็นวิธีที่นิยมที่สุดในการฝังค่าในสตริง ไวยากรณ์ของ f-string เหมาะมากสำหรับการปัด: จัดรูปแบบการแสดงผลได้ในบรรทัดเดียวโดยไม่ต้องเรียกเมธอดแยกต่างหาก โค้ดด้านล่างจะพิมพ์ 14.68
# Example number to be rounded
number = 14.67856
# Using f-strings to round to 2 decimal places
formatted_number = f"{number:.2f}"
print(formatted_number)
# 14.68
ใช้ format() เพื่อปัดเลขใน Python
ฟังก์ชันในตัว format() รับค่าและสเปคการจัดรูปแบบ แล้วคืนค่าเป็นสตริงที่จัดรูปแบบแล้ว แตกต่างจาก str.format() ตรงที่ส่งตัวเลขเข้าไปโดยตรง ไม่ต้องฝังในสตริงเทมเพลต โค้ดด้านล่างจะพิมพ์ 345.69
# Example number to be rounded
number = 345.68776
# Using the built-in format() to round to 2 decimal places
formatted_number = format(number, ".2f")
print(formatted_number)
# 345.69
ใช้โมดูลอื่นเพื่อปัดเลขใน Python
นอกเหนือจาก Python พื้นฐาน ยังมีโมดูลอื่น ๆ ที่ใช้ปัดเลขได้ จะขอยกตัวอย่างหลักสามอย่าง: math, decimal และ NumPy
ปัดด้วยโมดูล math
โมดูล math ไม่มีฟังก์ชันที่ปัดเลขไปยังตำแหน่งทศนิยมที่กำหนดโดยตรง แต่สามารถผสมผสานกับเลขคณิตอื่นเพื่อปัดเหลือสองตำแหน่งทศนิยมได้
ฟังก์ชัน math.floor() ใช้ปัดลงสู่จำนวนเต็มที่ใกล้ที่สุด หากต้องการปัดลงสองตำแหน่งทศนิยม ให้คูณด้วย 100 ใช้ math.floor() แล้วหารด้วย 100 โค้ดด้านล่างจะพิมพ์ 3.14
# Import math module
import math
# Example number to be rounded
number = 3.14159
# Using math.floor() to round down to 2 decimal places
rounded_down = math.floor(number * 100) / 100
print(rounded_down)
# 3.14
ในทำนองเดียวกัน ฟังก์ชัน math.ceil() จะปัดขึ้นสู่จำนวนเต็มที่ใกล้ที่สุด หากต้องการปัดขึ้นสองตำแหน่งทศนิยม ให้คูณด้วย 100 ใช้ math.ceil() แล้วหารด้วย 100 โค้ดด้านล่างจะพิมพ์ 3.15
# Import the math module
import math
# Example number to be rounded
number = 3.14159
# Using math.ceil() to round up to 2 decimal places
rounded_up = math.ceil(number * 100) / 100
print(rounded_up)
# 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() เพื่อปัดทุกองค์ประกอบในครั้งเดียว เร็วกว่าและอ่านง่ายกว่าการวนลูปด้วยตนเอง
import numpy as np
prices = np.array([1.2345, 9.8765, 3.14159])
rounded_prices = np.round(prices, 2)
print(rounded_prices)
# [1.23 9.88 3.14]
np.round() ใช้กฎการปัดแบบ banker's rounding เช่นเดียวกับ round() ในตัวของ Python เมธอด .round() ทำงานแบบเดียวกันบน DataFrame และ Series ของ pandas:
import pandas as pd
df = pd.DataFrame({"price": [1.2345, 9.8765, 3.14159]})
df["price_rounded"] = df["price"].round(2)
print(df)
# price price_rounded
# 0 1.2345 1.23
# 1 9.8765 9.88
# 2 3.14159 3.14
หากต้องการภาพรวมกว้าง ๆ ของการแปลงข้อมูลด้วย 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).