สมอง SML

คลังความรู้ / ถาม-ตอบ

#faq#rounding#decimal#gl#vat

ระบบปัดเศษทศนิยมเงินอย่างไร ทำไมยอดต่างกัน 0.01

ตอบสั้น: เงินทุกยอดคำนวณด้วย big.Rat และเก็บเป็นข้อความทศนิยม ไม่ใช้ float มีวิธีปัด 3 แบบ ใช้ต่างจุดกัน คือ ปัดครึ่งขึ้น, _round ของ C# ตาม round_type และ Math.Round แบบ ToEven ยอดต่าง 0.01 มักเกิดจากการปัดรายบรรทัดแล้วรวม เทียบกับรวมก่อนแล้วปัด

รายละเอียด

ค่าเงินจากจอ/DB แปลงด้วย ParseDecimalRat / numericToRat แล้วจัดรูปเป็นข้อความด้วย FormatRat ซึ่งปัดครึ่งขึ้นที่ scale ที่ส่งมา ดู การปัดเศษ ทศนิยม และตัวเลขเงิน (Rounding & Decimal Policy)

จำนวนทศนิยม (scale)

วิธีปัด

ฟังก์ชัน ปัดแบบ ใช้ที่
RoundHalfUp ครึ่งขึ้น (ห่างจากศูนย์) FormatRat, GL มาตรฐาน, ยอดชำระ, มัดจำ, ค่าเสื่อม
smlRound round_type = 1 คือครึ่งขึ้น (+0.000001), ค่าอื่นปัดไล่ทีละหลัก เช่น 3.7449 → 3.745 → 3.75 ยอดในตารางสินค้า, ยอดแปลงสกุลเงิน (เอกสารสกุลเงินต่างประเทศคำนวณและลงบัญชีกำไร/ขาดทุนอัตราแลกเปลี่ยนอย่างไร)
roundHalfEven ครึ่งไปเลขคู่ (C# Math.Round) sum_amount_exclude_vat (เฉพาะ vat_type 1 และ tax_type 0), GL ตามรูปแบบ, VAT ขายสินทรัพย์
csRound สำเนาของ _round ในงาน rebuild สต็อก stock_rebuild.go

ผลต่างจากการปัด

ข้อควรระวัง

  • sum_of_cost (qty × cost) ปัด 2 ตำแหน่งตายตัว ไม่ใช้ item_amount_decimal (trans.go:1058)
  • round_type ที่ไม่ใช่ 1 ทุกค่าจะปัดไล่หลัก (grid_calc.go:99) ค่า −1 (roundHalfUpType) ใช้ภายในโค้ดเท่านั้น
  • งาน rebuild สต็อกใช้ VAT 7% ตายตัว (stock_rebuild.go:179-180)
  • e-Tax: etaxAmounts รับค่าเป็น float64 และมีทางสำรองที่ใช้ math.Round (etax/handler.go:1016)
  • การปัดลอยตัวของ declining balance ในค่าเสื่อม ใช้ Text('e',14) = 15 หลักนัยสำคัญ (คิดค่าเสื่อมราคาสินทรัพย์ (โอนค่าเสื่อม 1801) คำนวณและลงบัญชีอย่างไร)

ดูเพิ่ม

ที่มาในโค้ด

  • backend/internal/application/process/service.go:107 ParseDecimalRat
  • backend/internal/application/process/service.go:149 RoundHalfUp; :177 FormatRat
  • backend/internal/application/process/service.go:508 ValidateAndBalanceJournal; :1614 เรียกที่ scale 2
  • backend/internal/application/process/grid_calc.go:99 round_type ≠ 1; :132 smlRound
  • backend/internal/application/process/fa_sale.go:93 roundHalfEven
  • backend/internal/application/process/trans.go:1055 sum_amount_exclude_vat ToEven; :1058 sum_of_cost 2 ตำแหน่ง
  • backend/internal/application/process/gl_template.go:378 addDiff; :730 glSQLOptions (gl_no_decimal)
  • backend/internal/application/process/gl_template_rules.go:344 action 90 บัญชีผลต่าง
  • backend/internal/application/process/stock_rebuild.go:113 csRound
  • frontend/src/lib/numeric.ts:522 getSmlDecimals; :587 formatMoneyDisplay