ต้องการทศนิยมตำแหน่งเดียว
กระทู้เก่าบอร์ด อ.Yeadram

 2,373   12
URL.หัวข้อ / URL
ต้องการทศนิยมตำแหน่งเดียว

รบกวนสอบถาม อ.yeadram และผู้รู้ทุกท่านครับ

ตัวอย่างครับ
15.236 = 15.2
17.589 = 17.5
20.889 = 20.8

ต้องการทศนิยมแค่ตำแหน่งเดียว โดยทศนิยมที่เหลือตัดทิ้งไม่สนใจ
ไม่ต้องปัดขึ้น ไม่ต้องปัดลง

ขอบคุณมากครับ

12 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R06171
ต้องการ 1 ตำแหน่ง = int( x * 10 ) / 10
ต้องการ 2 ตำแหน่ง = int( x * 100 ) / 100
ต้องการ 3 ตำแหน่ง = int( x * 1000 ) / 1000
...
...
ต้องการ n ตำแหน่ง = int( x * (10 ^ n) ) / (10 ^ n)
2 @R06175
ขอบคุณ อ.สันติสุข มากครับ
3 @R19504
ขอถามต่อด้วยนะครับ

ผมลอง ? int(45700*0.7)*100/100
ได้ 31989
ที่ถูกต้อง 31990 จะต้องแก้อย่างไรครับ
4 @R19505
ให้เปลี่ยนจาก int เป็น cdec ครับ   

แต่ก่อนเข้าใจว่า int ไม่มีปัญหาอะไร แต่ทีหลังรู้ว่ามันมีปัญหากับเรื่องปัดเศษ เป็นเรื่องบ้าๆของไมโครซอฟท์ จะสร้างหลุมพรางเอาไว้ทำไมก็ไม่รู้ โปรแกรมเมอร์ทั่วโลกโดนเหมือนกันหมด เสียเวลาจริงๆ ภาษาอื่น int( ) ก็คือ int ตรงๆตัวเลย ไม่เห็นจะเป็นปัญหายังไง

เท่าที่ทดสอบตอนนี้ cdec ไม่มีปัญหาครับ
5 @R19506
ผมไม่แน่ใจว่ามันเป็นบักเรื่องของ Data type ส่วนใหญ่ในการปัดเศษผมจะใส่ Val() คร่อมไว้อีกที เพื่อย้ำชัดๆว่ามันเป็นตัวเลข อย่างนี้ครับ

Int(Val(.......))

Int(Val((45700*0.7)*100/100)) = 31990

แต่ผมไม่ได้ทดสอบอะไรมากนักเหมือนของ อ. สันติสุข ถ้างั้นหากต้องการปัดเศษทั้งหมดก็ลองใช้แบบนี้ดูครับ

Int(CDec((45700* 0.7)*100/100)) = 31990

ได้ผลไงก็บอกด้วยนะครับ
6 @R19507
ปล. แต่ลักษณะของคุณที่ผิดคือ คุณต้องคำนวณให้เสร็จก่อนแล้วค่อยปัดเศษ
int(45700*0.7)*100/100 = 31989
ต้องใช้เป็น
int((45700*0.7)*100/100) = 31990
7 @R19508
แก้ไข
int(val(45700*0.7)*100/100) = 31990
8 @R19510
เพิ่มเติมอีกหน่อยนะครับพอดีนึกได้ ไม่ทราบว่าเป็นกันไม๊ คือเหมือนกับ VBA ของ MS Access จะมี bug อย่างตัวอย่างนี้ int(45700*0.7)*100/100 ถ้านำไปใช้ในคิวรี่จะใช้ได้ครับ จะมีปัญหาตอนใช้ในหน้า VBA จึงอาจไม่ใช่ที่ฟังก์ชั่นหรือเปล่า และอีกตัวอย่าง หากในหน้า VBA เราเขียนการคูณดังนี้

Debug.Print 11990 * 3
Debug.Print 21990 * 3
Debug.Print 31990 * 3

จะ Runtime Error 6 Over flow เหมือนกับมันมองเลขเป็น Integer
แต่หากเราใส่ 4 ขึ้นไป

Debug.Print 41990 * 3
Debug.Print 51990 * 3
Debug.Print 61990 * 3
...

จะไม่เกิด Error เพราะมันจะมองเป็น Long
ทั้งนี้เป็นเฉพาะในส่วนของ VBA เท่านั้นนะครับ ในคิวรี่จะไม่เป็น
หากใครเขียนโปรแกรมอยู่ให้ระวังด้วย โดยการแก้คือพยายามอย่าเขียนการคำนวณตัวเลขแบบตรงๆ ให้เขียนผ่านตัวแปรหรือคอนโทรล เพื่อจะได้กำหนดค่ามันให้แน่ขัดว่าเป็น Integer หรือเป็น Long เช่น
Const TTT As Long = 31990
Debug.Print TTT * 3
หรือ
Dim TTT As Long
TTT = 31990
Debug.Print TTT * 3
เป็นต้น

ดังนั้นผมจึงเข้าใจว่าน่าจะเป็นปัญหาเรื่องของการตีความ Data type ผิดของ VBA ทำให้เกิดปัญหาการคำนวณในหลายๆเรื่อง

9 @R19513
คุณสันติสุขให้สูตรนะครับ
ต้องการ 2 ตำแหน่ง = int( x * 100 ) / 100

ที่คุณสุรพงษ์ทดลอง
int(45700*0.7)*100/100
น่าจะผิดพลาดตรงวงเล็บครับ
45700*.07 คือค่า x ก็ควรจะเขียนอย่างอย่างนี้
Int( 45700*.07 * 100 ) / 1000
10 @R19517
ขอบคุณ อ.สันติสุข, คุณ TTT และ คุณ กัน มากครับ

งานผมต้องการ ทศนิยม 2 ตำแหน่งครับ งานเกี่ยวกับการเงิน
สินค้า จะมีลดราคาเป็น % หลายครั้ง เช่น ลด 30% ตาม 5% ตาม 3% โอกาศเป็นเลขทศนิยมสูงมาก
ลองดูแล้วที่แนะนำมา หลายแบบ อันนี้น่าจะใกล้สุด

? int(cdec(45705.17*.7 )*100)/100
31993.61

แต่ปัดไม่ถูก 31993.619 น่าจะเป็น 31993.62

ผมว่าจะหา function round( ) มาใช้ดู ขอหาก่อนครับ ถ้าได้ผลแล้วจะเอาฝากครับ
11 @R19518
อื่ม คงเข้าใจกันผิดแล้วครับ เพราะสูตรนี้คือ
"ต้องการทศนิยมแค่ตำแหน่งเดียว โดยทศนิยมที่เหลือตัดทิ้งไม่สนใจ ไม่ต้องปัดขึ้น ไม่ต้องปัดลง"
ตามหัวข้อกระทู้ครับ ไม่มีการปัดขึ้นหรือลงตัดออกเฉยๆครับ
12 @R19519
ถ้าเป็นการปัดเศษลองอ่านตามกระทู้นี้ดูครับ
http://www.thai-access.com/yeadram_view.php?topic_id=2602&page=1
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3273s