یک نوع Decimal با دقت دلخواه پیادهسازی کنید.
اعداد ممیز شناور رایجترین روش نمایش اعداد حقیقی غیرصحیح در رایانه هستند و استانداردی رایجاند که IEEE 754 آن را تعریف کرده است. این اعداد بسیار انعطافپذیر و همهکارهاند، اما محدودیتهایی هم دارند. معروف است که در حساب ممیز شناور، 0.1 + 0.2 != 0.3.
راهحل این مشکل این است که روشی دیگر و بدون اتلاف برای مدلسازی اعداد حقیقی غیرصحیح با دقت دلخواه پیدا کنیم. این روش ممکن است از نظر حافظه یا سرعت پردازش از اعداد ممیز شناور کمبازدهتر باشد؛ هدف، ارائهی نتایج دقیق است.
با اینکه Decimal یک نوع سفارشی است، باید همچنان بتوانیم با آنها مثل اعداد رفتار کنیم: عملگرهای ==، <، >، +، - و * همگی باید روی Decimalها همانطور که انتظار میرود کار کنند. برای صرفهجویی، لازم نیست تقسیم را پیادهسازی کنید، چون تقسیم با دقت دلخواه میتواند خیلی زود از کنترل خارج شود. (چطور 1/3 را با دقت دلخواه نمایش میدهید؟)
در Rust، راه بهدست آوردن این عملیات روی انواع سفارشی این است که traitهای مربوطه را برای آن پیادهسازی کنید. بهطور خاص، باید حداقل PartialEq، PartialOrd، Add، Sub و Mul را پیادهسازی کنید. از نظر دقیق، چون اعداد اعشاری یک ترتیب کامل تشکیل میدهند، بهتر است Eq و Ord را هم پیادهسازی کنید، هرچند این تستها آن traitها را بررسی نمیکنند.
پیادهسازی این تمرین با استفاده از crateی bigdecimal بسیار آسان خواهد بود. این کار را نکنید؛ خودتان آن را پیادهسازی کنید.