ข้ามไปที่เนื้อหาหลัก

ร้อยละ ทศนิยม 2 ตำแหน่งบวกคืน ไม่เท่ากับ 100 และ ปัญหาการคำนวณเลขทศนิยม เมื่อปัดเศษแล้วค่าที่บวกคืนไม่เท่าเดิม



กรณีนี้เป็นการทดสอบคำนวณเลขที่ต้องหารครึ่ง

ตัวอย่างเช่น 2.33 / 2 = 1.165 กรณีนี้ถ้าเก็บค่านี้ในฐานข้อมูลที่กำหนดให้มีทศนิยมเพียง 2 หลัก
ในฟิลด์ 2 ฟิลด์ซึ่งแต่ละฟิลด์จะถูกปัดขึ้นเป็น 1.7 เมื่อนำมาบวกกลับ 1.17 + 1.17 = 2.34

ถ้าอย่างนั้นเราก็ต้องกำหนดให้ฟิลด์ที่ใช้เก็บข้อมูลสามารถเก็บเลขทศนิยมได้หลายๆตัว ก็จะเก็บเลขทั้งสามหลักไว้ในฐานข้อมูลเลย 1.165 + 1.165 จะได้ 2.33 พอดี

แต่ตอนเราแสดงรายงาน ก็จำเป็นจะต้องแสดงเลขทศนิยมเพียงแค่ 2 หลักอยู่ดี แล้วเราจะทำอย่างไรล่ะทีนี้ ก็เก็บมันเป็นเลขทศนิยมเต็มจำนวนซะแล้วตอนแสดงก็ต้องปัดเศษอยู่ดี

เพราะค่า 1.165 ถ้าใช้ฟังก์ชั่นปัดเศษลง ก็จะเหลือ 1.16 แต่ถ้าปัดขึ้นก็จะเป็น 1.17 ซึ่งตัวเลขทั้งสองตัว เมื่อนำมารวมกัน ยังไงๆ ก็ไม่เท่ากับ 2.33 อยู่ดี (1.16+1.16 = 2.32,    1.17+1.17 = 2.34)



อีกตัวอย่างนึงครับเป็นการถอด VAT ราคาสินค้า

การคิดค่าทศนิยม แล้วผลรวมเพี้ยน เนื่องจากการปัดเศษ แล้วยอดเกินบ้าง ขาดบ้าง

ตัวอย่างการถอด VAT
ซื้อของมา 573.50 บาท
ถอด VAT ออกมาได้ (573.50*7) / 100 = 40.145
ราคาสินค้า จะได้เป็น 573.50 - 40.145 = 533.355

แสดงผลข้อมูลที่ได้
ราคาสินค้า | ภาษี 7% | ราคาสุทธิ |
533.36 | 40.15 | 573.50 |

แต่ถ้านำราคาสินค้า มาบวกกับ VAT จะได้เป็น 533.36 + 40.15 = 573.51

จะทำอย่างไรให้ค่าออกมาตรง 

(ตรวจสอบดูแล้วถ้าเลขทศนิยม 2 หลักจะดูหลักที่ 3
กรณีที่ทศนิยมเป็น .50 จะเกิดปัญหาว่าถอด VAT แล้วเมื่อนำมารวมยอดจะเกิน ส่วนค่าอื่นๆไม่ยังไม่พบข้อผิดพลาด)


ดังนั้น เราจะต้องหาวิธีในการคำนวณ และแสดงผลตัวเลขให้ถูกต้องให้ได้
ในตัวอย่างที่สองนั้นเท่าที่ลองทดสอบดู เวลาถอดทศนิยม ถอด VAT จะมีปัญหากับทศนิยมที่ลงท้ายด้วย .50
เฉพาะบางค่า ลองไล่ตั้งแต่ 1.01 ไปจนถึง 999.99 จะพบค่าที่เพี้ยนอยู่ประมาณ 874 ครั้ง
แสดงว่ามีค่า xxx.50 ประมาณ 874 ตัวที่ทศนิยม ถอด VAT แล้วนำมาบวกใหม่ค่าจะเกินไป 0.01 นั่นเอง


สำหรับกรณีอื่นๆ ยังไม่พบในการใช้งานจริง
อย่างตัวอย่างการหาร 2 เป็นเพียงเลขสมมติ เพื่อจะแสดงให้เห็นว่าคำนวณเพี้ยนอย่างไร
แต่ไม่รู้ว่าชีวิตจริง ได้ใช้วิธีหารแบบใดบ้าง ใครที่มีกรณีไหนที่น่าสนใจ โพสต์บอกกันบ้างก็ดีนะครับ
จะได้ช่วยป้องกันข้อผิดพลาดในการเขียนโปรแกรม ที่โอกาสมองเห็นข้อผิดพลาดเป็นไปได้น้อยมากๆ


สำหรับการแก้ไขปัญหาที่เกิดขึ้นนั้น จำเป็นที่จะต้องแก้มือเป็นครั้งๆ ไป โดยให้ยูสเซอร์แก้ไขได้เอง สำหรับวิธีคำนวณที่จะไม่ให้เกิดข้อผิดพลาดนั้น ยังหาไม่ได้ครับ ไว้โอกาสหน้าจะลองหาวิธีทดสอบดูก่อน แล้วจะมาเล่าให้ฟังกันนะครับ


แก้ไขเมื่อ 6/10/2561

จากกระทู้  https://www.thaicreate.com/php/forum/132239.html เรื่องการหาร้อยละ

จากภาพจะเห็นได้ว่า ไม่ว่าจะปัดทศนิยมด้วยหลักการเลขคู่ หรือเลขคี่ ข้อมูลชุดที่สอง ด้านล่างจะได้ 99.99 เสมอ เนื่องจากเมื่อปัดทศนิยมเหลือ 2 หลัก ส่วนที่เหลือจะถูกตัดทิ้งหมด เพราะไม่เข้ากับเงื่อนไข ในการปัดขึ้น

จึงสรุปได้ว่า สำหรับกรณี ร้อยละ จะต้องตรวจสอบผลรวมของเปอร์เซ็นต์ เพราะปัดให้กับจำนวนที่มีทศนิยมสูงที่สุด ที่ยังไม่ได้ปัดขึ้น (เลขหลัก 2 ยังเหมือนเดิม) ก่อนจะนำไปแสดงผล


แก้ไขเมื่อ 2557/06/09
----------------------------------
Pariwat Tiprutee

----------------------------------

ในการคำนวณ VAT หากทศนิยมตำแหน่งที่ 3 มีค่ามากกว่า 5 ให้ปัดขึ้น แต่ถ้ามีค่าน้อยกว่าหรือเท่ากับ 5 ให้ปัดทิ้งไปครับ

ตัวอย่างการถอด VAT
ซื้อของมา 573.50 บาท
ถอด VAT ออกมาได้ (573.50*7) / 100 = 40.145 ปัดเศษทิ้ง = 40.14
ราคาสินค้า จะได้เป็น 573.50 - 40.14 = 533.36

คราวนี้นำ VAT มาบวกกลับเข้าไปในสินค้า จะได้ 533.36 + 40.14 = 573.50 พอดีครับ


-----------------------------------------------
แก้ไขครั้งที่ 2 เมื่อ 2558/04/13
-----------------------------------------------
เนื่องจากตัวอย่างการถอด VAT ใช้สูตรผิดจึงขอขีดทับไปก่อน ยังหาตัวอย่างไม่ได้

ถอด VAT =  ราคา * 7 / 100
บวก VAT = ราคา * 7 / 107

ทดสอบดูแล้ว ไม่มีค่าใดผิดพลาดครับ ปัดเศษได้ปกติข้อมูลตามนี้ครับ
http://goo.gl/kHV8ub


แต่เคยมีกรณีที่แยกข้อมูลแล้วบวกกลับข้อมูลไม่ตรง แต่จำไม่ได้ครับ 
ใครพอจะเจอกรณีเหมือนกับการหารครึ่งรบกวนแนะนำทีนะครับ
2.33 / 2 = 1.165
1.17 + 1.17 = 2.34


--------------------------------------------
ติดตามเรื่องราวการเขียนโปรแกรม PHP ได้ที่
https://www.youtube.com/user/PHPcodingAndDesign/channels

เตรียมตัวก่อนเขียน PHP 5.5
https://www.youtube.com/playlist?list=PLEFxdFJkMLu78rEFPPzkpeieOGEJp730g







PHP CI MANIA PHP Code Generator 

โปรแกรมช่วยสร้างโค้ด "ลดเวลาการเขียนโปรแกรม"
ราคาสุดคุ้ม  
http://fastcoding.phpcodemania.com

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

FPDF ภาษาไทย กับ วรรณยุกต์ลอย

สำหรับงานเขียนโปรแกรมเว็บแอพฯ ด้วย PHP ที่ต้องทำการส่งออกข้อมูลเป็นไฟล์เอกสาร PDF นั้น เมื่อลองค้นดูแล้วก็เจอกับ FPDF เป็นคลาสที่เขียนขึ้นมาสำหรับงานนี้โดยเฉพาะ แต่กับภาษาไทยแล้วก็ต้องเจอกับปัญหาสุดคลาสสิคคือ รองรับภาษาไทยไม่ร้อยเปอร์เซ็นต์ ^^" บทความที่สอนการใช้งานเบื้องต้นที่ครอบคลุมการทำงานของ FPDF http://www.select2web.com/category/fpdf จะมีบทความแนะนำการใช้ฟอนต์ภาษไทยอยู่ที่ลิงค์นี้ http://www.select2web.com/fpdf/fpdf-lesson-10.html ดาวน์โหลดและสร้างฟอนต์มาใช้เอง http://witkub.blogspot.com/2011/11/fpdf.html สำหรับวิธีแก้ไขปัญหาวรรณยุกต์ลอย ลองดูวิธีจากที่นี่ http://punnawatt.blogspot.com/2009/07/pdf.html สุดท้ายแล้วลองทดลองมาหมด ก็ยังไม่ได้คำตอบที่ตรงใจครับ เพราะไม่สามารถแก้สระลอยได้อย่างแท้จริง เพราะเงื่อนไขข้อมูลจริงไม่อาจจะทำให้เหมือนในตัวอย่างได้ ก็เลยถอดใจเรื่องวรรณยุกต์ลอย นอกจากปัญหาเรื่องวรรณยุกต์ลอย แล้วฟอนต์บางตัวก็เกิดปัญหาวรรณยุกต์ซ้อนทับกันด้วย เช่นคำว่า "นี้" เมื่อผลลัพธ์ออกมา สระอี และวรรณยุกต์โท จะทับกัน สรุป 1. ดาวน์โหล

FPDI มาทำให้การสร้างเอกสาร PDF ด้วย PHP ง่ายขึ้นกันเถอะ

เคยใช้กันรึยังครับ เหมาะสำหรับงานสร้างแบบฟอร์ม PDF แล้วกรอกข้อมูลตามแบบฟอร์มทีหลัง หลักการคือโหลด PDF เข้ามา แล้วก็เขียนไฟล์ใหม่ขึ้นมา ส่วนที่มันไดนามิกมากๆ คงไม่เหมาะเท่าไหร่ ถ้าให้มองการทำงานของไลบรารี่ตัวนี้ ก็เหมือนกับที่เราสั่งทำใบเสร็จรับเงิน แล้วกรอกข้อมูลทีหลังนั่นเอง 1. สร้าง PDF เปล่าๆ ที่มีแค่ส่วนหัว และส่วนท้าย 2. เติมข้อมูลรายการลงในส่วนกลาง ถ้าเกินจำนวนแถวที่กำหนดให้ขึ้นหน้าใหม่ http://www.setasign.com/products/fpdi/about/ ตัวอย่างในลิงค์ต่อไปนี้ จะเป็นการนำข้อความในไฟล utf8test.txt ไปแทรกในไฟล์ logo.pdf http://www.setasign.com/products/fpdi/demos/tcpdf-demo/ PHP  CI  MANIA   -  PHP Code Generator  โปรแกรมช่วยสร้างโค้ด  "ลดเวลาการเขียนโปรแกรม" ราคาสุดคุ้ม    http://fastcoding.phpcodemania.com

PHP CI MANIA