กระทู้เก่าบอร์ด อ.Yeadram
13,206 16
URL.หัวข้อ /
URL
ปรึกษาเรื่องคำสั่งที่ใช้ในการปัดเศษทศนิยมใน Access
คือต้องการคำนวณค่าแล้วปัดเศษอ่ะค่ะ
ตัวอย่างเช่น 10 * 1.02 = 10.2 อยากจะปัดเศษขึ้นลง Half adjust อ่ะค่ะ
ไม่แน่ใจว่ามี tool อยู่แล้วหรือเราต้องเขียนคำสั่ง VBA ค่ะ
ขอบคุณสำหรับคนที่จะมาตอบน่ะค่ะ
ตัวอย่างเช่น 10 * 1.02 = 10.2 อยากจะปัดเศษขึ้นลง Half adjust อ่ะค่ะ
ไม่แน่ใจว่ามี tool อยู่แล้วหรือเราต้องเขียนคำสั่ง VBA ค่ะ
ขอบคุณสำหรับคนที่จะมาตอบน่ะค่ะ
16 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R12231
ขอบคุณค่ะ คุณ TTT พอดีลองใส่คำสั่ง =round(ค่านั้นอ่ะค่ะ) ลองเหมือน excel แล้วมัน work ด้วยค่ะ
3 @R12235
ระวังนะครับ
การใช้ฟังก์ชั่น Round(), CByte(), CInt(), CLng(), CCur() ใน MS Access มันเป็นการปัดเศษเลขคู่ วิธีการนี้มีชื่อเรียกหลายอย่างเช่น unbiased rounding, convergent rounding, statistician's rounding, Dutch rounding, Gaussian rounding, bankers' rounding แต่สามารถเรียกรวมกันได้ว่าเป็น การปัดเศษเลขคู่ (round-to-even)
หลักการปัดเศษเลขคู่คือ
ถ้าเป็นเลข 1-4 ปัดลง ถ้าเป็นเลข 6-9 ปัดขึ้น ส่วนเลข 5 ดูว่าหน้าเลข 5 ที่จะถูกปัดนั้นเป็นเลขคู่หรือคี่ โดยใช้หลักการเฉลี่ยว่า
ถ้าเป็นเลขคี่-->ปัดขึ้น
ถ้าเป็นเลขคู่-->ปัดลง (โดยถ้าเป็นเลข 0 ถือเป็นเลขคู่)
ฉนั้น ให้คุณทดสอบดู ถ้าเป็น 2.5 มันจะปัดลงเป็น 2 ส่วนถ้าเป็น 3.5 จะปัดขึ้นเป็น 4
สำคัญอยู่ที่เลขทศยมที่เป็น 5 อ่ะครับ มันอาจทำให้ค่ารวมของคุณเพี้ยนจากความต้องการได้ ให้คุณศึกษาและทดสอบดูก่อนใช้ Round() ว่าตรงกับความต้องการคุณหรือเปล่า ถ้าคุณต้องการแบบ round-half-up (Arithmetic Rounding) ผมแนะนำให้ใช้แบบของ อ.สันติสุข จะตรงที่สุด ตัวอย่าง
Round(2.5) = 2 ถ้าเป็น Val(Format(2.5,"#")) = 3
Round(3.5) = 4 ถ้าเป็น Val(Format(3.5,"#")) = 4
การใช้ฟังก์ชั่น Round(), CByte(), CInt(), CLng(), CCur() ใน MS Access มันเป็นการปัดเศษเลขคู่ วิธีการนี้มีชื่อเรียกหลายอย่างเช่น unbiased rounding, convergent rounding, statistician's rounding, Dutch rounding, Gaussian rounding, bankers' rounding แต่สามารถเรียกรวมกันได้ว่าเป็น การปัดเศษเลขคู่ (round-to-even)
หลักการปัดเศษเลขคู่คือ
ถ้าเป็นเลข 1-4 ปัดลง ถ้าเป็นเลข 6-9 ปัดขึ้น ส่วนเลข 5 ดูว่าหน้าเลข 5 ที่จะถูกปัดนั้นเป็นเลขคู่หรือคี่ โดยใช้หลักการเฉลี่ยว่า
ถ้าเป็นเลขคี่-->ปัดขึ้น
ถ้าเป็นเลขคู่-->ปัดลง (โดยถ้าเป็นเลข 0 ถือเป็นเลขคู่)
ฉนั้น ให้คุณทดสอบดู ถ้าเป็น 2.5 มันจะปัดลงเป็น 2 ส่วนถ้าเป็น 3.5 จะปัดขึ้นเป็น 4
สำคัญอยู่ที่เลขทศยมที่เป็น 5 อ่ะครับ มันอาจทำให้ค่ารวมของคุณเพี้ยนจากความต้องการได้ ให้คุณศึกษาและทดสอบดูก่อนใช้ Round() ว่าตรงกับความต้องการคุณหรือเปล่า ถ้าคุณต้องการแบบ round-half-up (Arithmetic Rounding) ผมแนะนำให้ใช้แบบของ อ.สันติสุข จะตรงที่สุด ตัวอย่าง
Round(2.5) = 2 ถ้าเป็น Val(Format(2.5,"#")) = 3
Round(3.5) = 4 ถ้าเป็น Val(Format(3.5,"#")) = 4
4 @R12236
สรุป ตามความเห็นผมคือ ถ้าเป็นการสรุปผลรวมทางการเงิน หรือค่าเฉลี่ยแบบผลรวมตัวเลขมากๆ แล้วค่าที่ได้จะไม่เฟ้อเกินไป การใช้ Round() ถือว่าเหมาะสม แต่ถ้าเป็นค่าที่เข้าสูตรที่เจาะจงให้ปัดเศษขึ้นที่เลข 5 แล้ว การใช้ ฟังก์ชั่น Round() ใช้ไม่ได้ครับ
ยังไงลองศึกษาดูได้ ในเว็บหลายเว็บมีเขียนไว้ หาได้จาก Google
ยังไงลองศึกษาดูได้ ในเว็บหลายเว็บมีเขียนไว้ หาได้จาก Google
5 @R12316
คุณ TTT
การใช้คำสั่ง round เป็นแบบที่คุณ TTT บอกเลยค่ะ ^^ ไม่เวิร์ค
แล้วลองเอาคำสั่ง Val(Format(3.5,"#")) = 4 มาใช้โอเคแก้ไขปัญหาได้เลยค่ะ
ขอบคุณมากๆๆๆๆน่ะค่ะ
การใช้คำสั่ง round เป็นแบบที่คุณ TTT บอกเลยค่ะ ^^ ไม่เวิร์ค
แล้วลองเอาคำสั่ง Val(Format(3.5,"#")) = 4 มาใช้โอเคแก้ไขปัญหาได้เลยค่ะ
ขอบคุณมากๆๆๆๆน่ะค่ะ
6 @R16868
นำไปใช้เเล้ว ใช้ได้ผลจริง ๆ ขอบคุณมากค่ะ
แต่ถ้าเราต้องการทศนิยม 2 ตำแหน่ง โดยไม่ปัดทศนิยม
เช่น 2.66666 เป็น 2.66
หรือ 3.000 เป็น 3.00
รบกวนด้วยค่ะ
แต่ถ้าเราต้องการทศนิยม 2 ตำแหน่ง โดยไม่ปัดทศนิยม
เช่น 2.66666 เป็น 2.66
หรือ 3.000 เป็น 3.00
รบกวนด้วยค่ะ
7 @R16869
รู้จักคำสั่ง InStr หรือเปล่าครับ เป็นการนับตำแหน่งที่จากจุดที่เราสนใจ เช่น ในตัวอย่างนี้ ถ้าเรานับได้ว่า จุดทศนิยม อยู่ตำแหน่งที่เท่าไหร่ของแต่ละจำนวนนั้นๆ ได้ เราก็ใช้คู่กับสูตร Left ให้นับตั้งแต่หลังจุดทศนิยมนั้นไปอีก 2 ตำแหน่งได้ครับ
SELECT Number.Number, InStr([Number],".") AS P, Left([Number],[P]+2) AS Ans
FROM [Number];
SELECT Number.Number, InStr([Number],".") AS P, Left([Number],[P]+2) AS Ans
FROM [Number];
8 @R16870
9 @R16872
เยี่ยม
10 @R16873
ใช้เป็นสูตรง่ายๆได้เลยครับ
ทศนิยม 1 ตำแหน่ง
= int( x * 10) / 10
ทศนิยม 2 ตำแหน่ง
= int( x * 100) / 100
ทศนิยม n ตำแหน่ง
= int( x * (10 ^ n)) / (10 ^ n)
เช่น
2.66666
int(2.66666 * 100) / 100
= 2.66
ทศนิยม 1 ตำแหน่ง
= int( x * 10) / 10
ทศนิยม 2 ตำแหน่ง
= int( x * 100) / 100
ทศนิยม n ตำแหน่ง
= int( x * (10 ^ n)) / (10 ^ n)
เช่น
2.66666
int(2.66666 * 100) / 100
= 2.66
11 @R16876
ขอบคุณทุกท่านมากเลยค่ะ
ข้อมูลเป็นเเบบนี้นะค่ะ ฟิลด์ NetGPA มีค่า 1.500000
ผลจากการนำไปใช้นะค่ะ
1.ของคุณ Saifar มีปัญหาตรงหากจุดทศนิยมเป็น 0 จะไปไม่แสดงค่า 0 ค่ะ
ซึ่งการแสดง GPA จะต้องแสดงค่าด้วย เช่น 2.50 , 3.00 ค่ะ ซื่งจากต่อนแรกที่ใช้ Left เพียงอย่างเดียวก็มีปัญหานี้เช่นกัน
2. ของคุณ TTT ตอนแรกที่ใช้ GPA:(int([NetGPA]*100)/100) ค่าที่ได้เป็น 1.00 ค่ะ แต่พอปรับเป็น GPA:([NetGPA]*100)/100) ผลลัพธ์กลับเป็นไปตามที่ต้องการคือ 1.50
***อย่างทราบว่าเป็นเพราะอะไร หากไม่ใช้ INT แบบนี้ มีโอกาศจะ Error ในจุดอื่น ๆ หรือไม่ค่ะ
ข้อมูลเป็นเเบบนี้นะค่ะ ฟิลด์ NetGPA มีค่า 1.500000
ผลจากการนำไปใช้นะค่ะ
1.ของคุณ Saifar มีปัญหาตรงหากจุดทศนิยมเป็น 0 จะไปไม่แสดงค่า 0 ค่ะ
ซึ่งการแสดง GPA จะต้องแสดงค่าด้วย เช่น 2.50 , 3.00 ค่ะ ซื่งจากต่อนแรกที่ใช้ Left เพียงอย่างเดียวก็มีปัญหานี้เช่นกัน
2. ของคุณ TTT ตอนแรกที่ใช้ GPA:(int([NetGPA]*100)/100) ค่าที่ได้เป็น 1.00 ค่ะ แต่พอปรับเป็น GPA:([NetGPA]*100)/100) ผลลัพธ์กลับเป็นไปตามที่ต้องการคือ 1.50
***อย่างทราบว่าเป็นเพราะอะไร หากไม่ใช้ INT แบบนี้ มีโอกาศจะ Error ในจุดอื่น ๆ หรือไม่ค่ะ
12 @R16878
พบปัญหาแบบนี้ค่ะ
13 @R16880
ผมขออธิบายให้ฟังคร่าวๆนะครับ
จากสูตร int(2.66666*100)/100
1. นำ 2.66666 มาคูณกับ 100 เพื่อเลื่อนจุดทศนิยมไป 2 ตำแหน่ง
2.66666 * 100 ผลลัพธ์ 266.666
2. ใช้ฟังก์ชั่น int() ตัดจุดทศนิยมที่เหลือหลังการคูณด้วย 100 ออก
int(266.666) ผลลัพธ์ 266
3. นำผลลัพธ์ข้อ 2 มาหารด้วย 100 อีกที เพื่อให้เป็นค่าทศนิยมดังเดิม
266 / 100 ผลลัพธ์ 2.66
ฉนั้นในสูตร คุณต้องใช้ฟังก์ชั่น Int() ด้วยครับ โดยจะได้ดังนี้
GPA:(int([NetGPA]*100)/100)
แต่หากคุณต้องการให้แสดงค่าเลข 0 ด้วย ในกรณี 1.5 เป็น 1.50 ก็เพื่อฟังก์ชั่น Format() คล่อมเข้าไปอีกทีดังนี้:
GPA:Format((int([NetGPA]*100)/100), "0.00")
ประมาณนี้ครับ หวังว่าคงเข้าใจนะครับ
จากสูตร int(2.66666*100)/100
1. นำ 2.66666 มาคูณกับ 100 เพื่อเลื่อนจุดทศนิยมไป 2 ตำแหน่ง
2.66666 * 100 ผลลัพธ์ 266.666
2. ใช้ฟังก์ชั่น int() ตัดจุดทศนิยมที่เหลือหลังการคูณด้วย 100 ออก
int(266.666) ผลลัพธ์ 266
3. นำผลลัพธ์ข้อ 2 มาหารด้วย 100 อีกที เพื่อให้เป็นค่าทศนิยมดังเดิม
266 / 100 ผลลัพธ์ 2.66
ฉนั้นในสูตร คุณต้องใช้ฟังก์ชั่น Int() ด้วยครับ โดยจะได้ดังนี้
GPA:(int([NetGPA]*100)/100)
แต่หากคุณต้องการให้แสดงค่าเลข 0 ด้วย ในกรณี 1.5 เป็น 1.50 ก็เพื่อฟังก์ชั่น Format() คล่อมเข้าไปอีกทีดังนี้:
GPA:Format((int([NetGPA]*100)/100), "0.00")
ประมาณนี้ครับ หวังว่าคงเข้าใจนะครับ
14 @R16881
ปล. ดูวงเล็บให้ดีๆนะครับ มันหมายถึงการกระทำก่อนหลังของสูตร ในตัวอย่างที่คุณโพสมา คุณใส่วงเล็บผิดนะครับ
15 @R16885
อ้อ ...จริงด้วย
ขอบคุณมาก ๆ เลยนะค่ะ
ขอคำปรึกษาอะไรได้คุณ TTT ช่วยไว้ตลอดเลย
ขอบคุณมาก ๆ เลยนะค่ะ
ขอคำปรึกษาอะไรได้คุณ TTT ช่วยไว้ตลอดเลย
16 @R16888
หลังจุดทศนิยมเป็นศูนย์ ก็แสดงค่าได้นี่ครับ
Time: 0.3626s
ถึง Message สุดท้ายของ อ.สันติสุข
val(format(นิพจน์,"#.##")) สำหรับทศนิยม 2 ตำแหน่ง