Decimal از float مقدارِ همان float موجود را تبدیل میکند؛ رقمِ اعشاریِ موردنظرِ پیش از گردشدن را حدس نمیزند. اگر رشتهٔ اصلیِ 0.1 را دارید، ساخت از آن با ساخت از floatِ0.1 یکسان نیست. تمرین این صفحه مقدارِ اولیه، دقتِ محاسبه و زمانِ quantize را جدا اجرا میکند. هیچ قیمت، پیشفاکتور یا قاعدهٔ قانونیِ گردکردن در این نمونه تعیین نمیشود.
از چه مقداری شروع کردهایم؟
Decimal('0.1') دقیقاً یکدهمِ دهدهی را از رشته میگیرد. اما Decimal(0.1) از مقدارِ ازپیشساختهشدهٔ binary float شروع میکند و در این اجرا رشتهٔ بلندِ 0.1000000000000000055511151231257827021181583404541015625 میدهد. طولانیبودنِ نمایش به معنی ساختهشدنِ تصادفیِ رقم نیست؛ تبدیلِ دقیقِ همان مقدارِ باینری است.
کد با Fraction هم این تمایز را میسنجد: مقدارِ رشته با۱/۱۰ برابر است و مقدارِ تبدیلشده از float با Fraction.from_float(0.1) برابر میماند. این شاهد دربارهٔ مقدارِ فعلیِ ورودی است؛ هیچ روشِ حدسی برای بازیابیِ متنِ اصلی از float ارائه نمیکند. تبدیلِ strِیک float نیز لزوماً منبعِ اولیهٔ فرستنده را بازسازی نمیکند.
تبدیلِ ناخواسته را در آزمایش ببینیم
در یک localcontext جدا، trapِ FloatOperation روشن میشود و ساختِ Decimal از floatِ0.1 واقعاً خطا میدهد. هدف، آشکارشدنِ اختلاطِ ناخواسته در همین مرحله است؛ نمیگوییم این trap همهٔ مقایسهها یا همهٔ مسیرهای اختلاط را همیشه متوقف میکند. مثالِ آزمودهشده constructor است و گزارش همان را ثبت میکند.
تنظیمِ context بهصورت محلی است؛ حالتِ عمومیِ مفسر برای کارهای دیگر تغییر نمیکند. در اجرای نمونه، ورودیهای این مسیر همگی ساختهٔ نویسندهاند. هیچ عددِ واقعیِ مالی، سندِ مشتری یا دادهٔ محرمانه برای نمایشِ خطا استفاده نشده است.
precision تعدادِ رقمِ constructor نیست
در context با precision برابرِ۳، ساختِ Decimal('1.234567') همچنان تمامِ رقمهای همین رشته را نگه میدارد. اما وقتی همان مقدار را با Decimal(0) جمع میکنیم، نتیجهٔ محاسبه 1.23 میشود. تقسیمِ۱بر۳ هم در آن context برابرِ0.333 است. پس حفظِ ورودی و دقتِ عملیات دو مرحلهٔ جدا هستند.
| عملِ واقعی در precision=3 | نتیجه | برداشت |
|---|---|---|
| constructor از رشته | 1.234567 | رقمِ ورودی حفظ میشود |
| جمع با صفر | 1.23 | عملیات تابعِ context است |
| تقسیمِ۱بر۳ | 0.333 | اعشارِ نامتناهی کامل ذخیره نشده |
نامِ Decimal تضمین نمیکند هر حسابی با هر precision دقیق و بدون گردکردن باشد. context، exponent، trapها و عملیات باید همراهِ نتیجه معلوم باشند. این تمرین فقط مثالهای محدود و متناهی را بررسی میکند؛ overflow و همهٔ حالتهای ویژهٔ محاسبات در آن پوشش داده نشدهاند.
دو قاعدهٔ quantize در نقطهٔ تساوی
برای نمایشِ اختلاف، عددِ 2.345 را تا نمایِ0.01 گرد میکنیم. ROUND_HALF_EVEN در نمونه2.34 و ROUND_HALF_UP مقدار2.35 میدهد. برای2.355 هر دو2.36 میشوند. نمونهٔ منفیِ−2.345 نیز جدا اجرا میشود: نتیجهها بهترتیب−2.34 و−2.35 هستند. اینها تعریفِ همان دو قاعدهاند، نه انتخابِ قانونِ مناسبِ یک سندِ واقعی.
نامِ HALF_UP را به «همیشه به سمتِ عددِ مثبت» ترجمه نکنیم؛ نمونهٔ منفی کمک میکند این سوءبرداشت روشن شود. کد rounding را در فراخوانیِ quantize صریح میدهد و exponentِدو رقمِ اعشار هم اعلامی است. قاعدهٔ قراردادیِ کسبوکار باید جدا مشخص شود.
چه زمانی گرد کردهایم؟
سه مقدارِ اصیلِ0.005 را با هم جمع میکنیم. اگر ابتدا جمع و بعد با HALF_UP تا0.01 گرد کنیم،0.02 حاصل میشود. اگر هر جزء را همان ابتدا تا0.01 گرد و سپس جمع کنیم،0.03 میگیریم. هر دو خروجی واقعاً اجرا و با انتظارِ مستقل کنترل شدهاند؛ تفاوتِ زمانِ گردکردن در نامِ نهاییِ عدد پنهان نیست.
این مثال واحدِ پول ندارد و هیچ نسخهٔ معتبرِ محاسبهٔ مالیات یا تخفیف را اعلام نمیکند. راهنمای کنترلِ عددهای جدول واحد، فرمول و دامنهٔ عملیات را مشخص میکند؛ این صفحه منشأ مقدار و contextِ حساب را با کد نشان میدهد.
قراردادِ ورودی و قدم بعد
تابعِ محدودِ دریافت، رشتهٔ حداکثر۳۲نویسه، مقدارِ متناهی و دامنهٔ قدرمطلقِ حداکثرِ یکمیلیون را میپذیرد. NaN، Infinity، منفیِInfinity و1000001، بهاضافهٔ دو رشتهٔ۳۲نویسهایِ مثبت و منفی که اندکی بیرونِ کراناند، در شش آزمون رد میشوند. کنترلِ قدرمطلق با copy_abs انجام میشود تا خودِ بررسیِ کران تحتِ precision گرد نشود؛ abs معمولیِ Decimal در این مرز میتواند مقدار را گرد کند. این سقفِ آموزشی است و نه محدودهٔ عمومیِ Decimal. نسخهٔ اجرای واقعی Python۳٫۱۲٫۱۴ است؛ هیچ کتابخانهای نصب نشده است.
قراردادِ عددِ صحیحِ بزرگ در JSON مسئلهٔ متفاوتِ ازبینرفتنِ دقت هنگامِ parse را توضیح میدهد. برای ادامه در مبانی هوش مصنوعی، رشتهٔ منبع، واحد و قاعدهٔ عملیات را کنار خروجی ثبت کنید. این تمرین موتورِ محاسبه یا تعرفهٔ محصولات اپرا را توصیف نمیکند؛ کمک میکند دقتِ ظاهری را با مقدارِ اولیهٔ درست اشتباه نگیریم.
فایل تمرین و منبع
کد کامل تمرینِ محلی و کنترلهای آن · نمونههای اصیل و نتیجهٔ اجرای واقعیِ همین کد
منابع در 2026-11-04 خوانده شدند؛ این تاریخ، تاریخ انتشار منبع نیست. مثالها و فایلهای این راهنما آموزشی و ساختهٔ تحریریهاند.