ทศนิยมความละเอียดสูง (Exact Decimal Arithmetic)
เลขทศนิยมลอยตัว (f32, f64) จัดเก็บข้อมูลด้วยเศษส่วนฐานสอง ซึ่งก่อให้เกิดความคลาดเคลื่อนในการคำนวณเลขฐานสิบทางการเงิน (เช่น )
SabiQuant มอบ DecimalAmount กลไกการคำนวณเลขทศนิยมจุดคงที่ (Fixed-point) ขนาด 128-bit ความสมบูรณ์สูง ออกแบบมาเพื่อระบบบัญชี การชำระราคา (Clearing) และการโอนเงินโดยเฉพาะ
ข้อมูลจำเพาะหลัก (Key Specifications)
- Internal Representation: จำนวนเต็มมีเครื่องหมายขนาด 128-bit พร้อมเลขชี้กำลังฐานสิบ
- Precision: ความแม่นยำแน่นอนสูงสุดถึง 38 ตำแหน่งทศนิยม
- Zero Allocations: จัดเก็บข้อมูลบน Stack แบบ Copy semantics ไม่มีการจองหน่วยความจำบน Heap
- Rounding Modes: โหมดการปัดเศษมาตรฐาน 7 รูปแบบตามมาตรฐาน IEEE 754 / ISO:
HalfEven(Banker’s rounding - ค่ามาตรฐานของสถาบันการเงินสากล)HalfUp(ปัดเศษขึ้นเมื่อถึงครึ่งหนึ่งไปยังอนันต์บวก)HalfDown(ปัดเศษลงเมื่อถึงครึ่งหนึ่งเข้าหาศูนย์)Ceiling(ปัดขึ้นไปยัง )Floor(ปัดลงไปยัง )Up(ปัดออกจากศูนย์)Down(ตัดเศษเข้าหาศูนย์)
ตัวอย่างโค้ดในภาษา Rust
use sabiquant::exact::{DecimalAmount, RoundingMode};
fn main() -> Result<(), Box<dyn std::error::Error>> { // การแปลงสตริงตัวเลขทศนิยมแน่นอน let price = DecimalAmount::from_str("102.435000000000000000")?; let factor = DecimalAmount::from_str("0.045000000000000000")?;
// การคูณแบบตรวจสอบ Overflow let gross = price.checked_mul(&factor)?; println!("Exact Gross: {}", gross);
// การปัดเศษทศนิยม 2 ตำแหน่งเพื่อการชำระเงินสด let rounded_bankers = gross.round(2, RoundingMode::HalfEven)?; let rounded_up = gross.round(2, RoundingMode::Up)?;
println!("Half-Even (Banker's): {}", rounded_bankers); println!("Round Up: {}", rounded_up);
// การเปรียบเทียบที่ปลอดภัยโดยไม่มี Epsilon jitter assert!(rounded_bankers <= rounded_up);
Ok(())}