چرا از دو یا شناور برای نشان دادن ارز استفاده نمی کنید؟

ساخت وبلاگ

من همیشه به من گفته شده است که هرگز با انواع دو یا شناور پول نشان ندهم ، و این بار این سؤال را برای شما مطرح می کنم: چرا؟من مطمئن هستم که یک دلیل بسیار خوب وجود دارد ، من به سادگی نمی دانم که چیست.

دنبال کردن 304K 43 43 نشان های طلا 301 301 نشان نقره 478 478 نشان های برنز از 16 سپتامبر 2010 در 19:23 پرسید Fran Fitzpatrick Fran Fitzpatrick 17. 7K 15 15 نشان طلا 33 33 نشان نقره 34 34 نشان برنز این سؤال را ببینید: خطاهای گرد؟ 16 سپتامبر 2010 در 19:31 فقط برای روشن بودن ، آنها نباید برای هر چیزی که نیاز به دقت داشته باشد استفاده شود - نه فقط ارز. 16 سپتامبر 2010 در 19:59

آنها نباید برای هر چیزی که نیاز به دقت داشته باشد استفاده شود. اما 53 بیت قابل توجه دو برابر (~16 رقم اعشاری) معمولاً برای مواردی که صرفاً به دقت نیاز دارند ، به اندازه کافی مناسب هستند.

17 سپتامبر 2010 در 19:23

Jeff نظر شما کاملاً نادرست را بیان می کند که نقطه شناور باینری برای آن مفید است و چه چیزی برای آن مفید نیست. پاسخ Zneak را در زیر بخوانید ، و لطفاً نظر گمراه کننده خود را حذف کنید.

3 آگوست 2014 در 21:08 و برای روشن بودن ، با "دقت" (یا "دقت") منظور شما در اعشاری است. 20 آگوست 2021 در 16:38

16 پاسخ 16

مرتب شده توسط: تنظیم مجدد به طور پیش فرض 1232

از آنجا که شناورها و دو برابر نمی توانند به طور دقیق 10 ضرب پایه را که برای پول استفاده می کنیم ، نشان دهند. این مسئله فقط برای جاوا نیست ، بلکه برای هر زبان برنامه نویسی است که از انواع نقطه شناور پایه 2 استفاده می کند.

در پایه 10 ، می توانید 10. 25 را به عنوان 1025 * 1 0-2 بنویسید (یک عدد صحیح با قدرت 10). شماره های شناور IEEE-754 متفاوت هستند ، اما یک روش بسیار ساده برای فکر کردن در مورد آنها این است که به جای آن با یک قدرت دو ضرب کنید. به عنوان مثال ، شما می توانید به 164 * 2-4 (یک عدد صحیح از قدرت دو) نگاه کنید ، که نیز برابر با 10. 25 است. اینگونه نیست که اعداد در حافظه نشان داده می شوند ، بلکه پیامدهای ریاضی یکسان هستند.

حتی در پایه 10 ، این نماد نمی تواند به طور دقیق ساده ترین کسری را نشان دهد. به عنوان مثال ، شما نمی توانید 1/3 را نمایندگی کنید: بازنمایی اعشاری در حال تکرار است (0. 3333.) ، بنابراین هیچ عدد صحیح محدودی وجود ندارد که بتوانید با یک قدرت 10 ضرب کنید تا 1/3 دریافت کنید. شما می توانید در یک دنباله طولانی از 3 و یک نماینده کوچک مانند 333333333 * 1 0-10 حل و فصل کنید ، اما دقیق نیست: اگر آن را با 3 ضرب کنید ، 1 نمی گیرید.

با این حال ، به منظور شمارش پول ، حداقل برای کشورهایی که پول آنها به ترتیب بزرگی از دلار آمریکا ارزش دارد ، معمولاً تمام آنچه شما نیاز دارید این است که بتوانید چند برابر 10 تا 2 را ذخیره کنید ، بنابراین مهم نیستکه 1/3 قابل نمایش نیست.

مشکل شناورها و دونفره ها این است که اکثریت قریب به اتفاق تعداد پول مانند به عنوان یک عدد صحیح از زمان 2 قدرت ندارند. با پول به دلیل اینکه آنها سنت عدد صحیح هستند) که می توانند دقیقاً به عنوان یک شماره نقطه شناور باینری IEEE-754 نشان داده شوند 0 ، 0. 25 ، 0. 5 ، 0. 75 و 1 است. همه بقیه با مقدار کمی خاموش هستند. به عنوان قیاس با مثال 0. 333333 ، اگر مقدار نقطه شناور را برای 0. 01 بگیرید و آن را با 10 ضرب کنید ، 0. 1 دریافت نخواهید کرد. در عوض چیزی مانند 0. 099999999786 دریافت خواهید کرد.

نمایندگی پول به عنوان یک دو یا شناور احتمالاً در ابتدا خوب به نظر می رسد زیرا نرم افزار خطاهای ریز و درشت را دور می کند ، اما هرچه افزودنی های بیشتری را انجام می دهید ، تفریق ، ضرب و تقسیمات مربوط به شماره های غیرقابل توصیف ، خطاها پیچیده می شوند و شما به ارزش هایی می پردازید که ارزش آن را به دست می آورید. به وضوح دقیق نیستنداین امر باعث می شود شناورها و دو برابر برای برخورد با پول ناکافی شوند ، جایی که دقت کامل برای چند برابر قدرت پایه 10 لازم است.

راه حلی که تقریباً در هر زبانی کار می کند ، استفاده از عدد صحیح به جای آن و شمارش سنت است. به عنوان مثال ، 1025 1025 دلار خواهد بود. چندین زبان نیز برای مقابله با پول انواع داخلی دارند. در میان دیگران ، جاوا دارای کلاس بزرگ است و زنگ زدگی دارای جعبه زنگ زدگی_دیمیمال است و C# دارای نوع اعشاری است.

دنبال کردن 3،531 3 3 نشان های طلا 27 27 نشان نقره 41 41 نشان برنز در 16 سپتامبر 2010 در 19:26 پاسخ داد Zneak Zneak 134K 41 41 نشان طلا 255 255 نشان نقره 324 324 نشان های برنز

Fran شما خطاهای گرد را دریافت خواهید کرد و در بعضی موارد که از مقادیر زیادی ارز استفاده می شود ، محاسبات نرخ بهره می تواند به شدت خاموش باشد

16 سپتامبر 2010 در 19:29

بشربیشتر بخش های پایه 10 ، یعنی. به عنوان مثال ، 0. 1 نمایش دقیق با دوین باینری وجود ندارد. بنابراین ، 1. 0 / 10 * 10 ممکن است برابر با 1. 0 نباشد.

16 سپتامبر 2010 در 19:30

@LinuxUser27 فکر می کنم Fran سعی داشت خنده دار باشد. به هر حال ، پاسخ Zneak بهترین چیزی است که من دیده ام ، حتی بهتر از نسخه کلاسیک Bloch.

8 اکتبر 2012 ساعت 20:28

البته اگر دقت را می دانید ، همیشه می توانید نتیجه را دور بزنید و از این رو از کل مسئله خودداری کنید. این بسیار سریعتر و ساده تر از استفاده از BigDecimal است. گزینه دیگر استفاده از دقت ثابت یا طولانی است.

24 فوریه 2013 در 12:12

Jol شما درست می گویید ، جمله ای که شناور (0. 1) * 10 ≠ 1 اشتباه است. در یک شناور دوتایی ، 0. 1 به عنوان 0B0. 000110011001100110011001100110011001100110011001101010 و 10 به عنوان 0B1010 نشان داده شده است. اگر این دو شماره باینری را ضرب کنید ، 1. 000000000000000000000000000000000000000000000010 را دریافت می کنید ، و پس از آن به 53 رقم باینری موجود گرد شده است ، دقیقاً 1. مشکل شناور نیست که همیشه آنها اشتباه می شوند ، بلکه بعضی اوقات مانند آنها انجام می دهند - مانند آنها - مانند آ ن-مثال 0. 1 + 0. 2 ≠ 0. 3.

15 دسامبر 2018 در 17:59

از Bloch ، J. ، Java مؤثر ، (چاپ دوم ، مورد 48. چاپ 3 ، مورد 60):

انواع شناور و مضاعف به ویژه برای محاسبات پولی مناسب نیستند زیرا نمایانگر 0. 1 (یا هر قدرت منفی دیگر ده) به عنوان شناور یا دو برابر نیست.

به عنوان مثال ، فرض کنید 1. 03 دلار دارید و 42c هزینه می کنید. چقدر پول باقی مانده است؟

system. out. println (1. 03 - . 42) ؛ 

چاپ 0. 6100000000000001.

راه درست برای حل این مشکل استفاده از bigdecimal ، int یا طولانی برای محاسبات پولی است.

اگرچه BigDecimal برخی از احتیاط ها را دارد (لطفاً پاسخ پذیرفته شده در حال حاضر را ببینید).

دنبال کردن 9،886 1 1 نشان طلا 20 20 نشان نقره 24 24 نشان برنز در 16 سپتامبر 2010 در 19:52 پاسخ داد سگبان 264K 75 75 نشان های طلا 394 394 نشان نقره 412 412 نشان های برنز

من از توصیه استفاده از int یا طولانی برای محاسبات پولی کمی گیج شده ام. چگونه می توانید 1. 03 را به عنوان int یا طولانی معرفی کنید؟من "طولانی a = 1. 04 ؛" را امتحان کردمو "طولانی a = 104/100 ؛"بدون فایده

15 مارس 2014 در 10:32 Peter ، شما از A = 104 طولانی استفاده می کنید و به جای دلار در سنت حساب می کنید. 17 مارس 2014 در 1:49 zneak وقتی که یک درصد مانند علاقه مرکب یا مشابه مورد استفاده قرار می گیرد ، چه می شود؟ 6 مارس 2016 در 3:41 trusktr ، من با نوع اعشاری پلت فرم شما می روم. در جاوا ، این بزرگ است. 6 مارس 2016 در 19:42

maaartinus. و فکر نمی کنید استفاده از دو برابر برای چنین مواردی مستعد خطا باشد؟من دیده ام که مسئله گرد شدن شناور به سختی سیستم های واقعی را به خود جلب کرده است. حتی در بانکداریلطفاً آن را توصیه نکنید ، یا اگر این کار را کردید ، آن را به عنوان یک پاسخ جداگانه ارائه دهید (بنابراین ما می توانیم آن را پایین بیاوریم: P)

16 فوریه 2017 در 10:57

این موضوع صحت نیست و همچنین موضوع دقیق نیست. این مسئله است که انتظارات انسانهایی را که از پایه 10 برای محاسبات به جای پایه استفاده می کنند ، برآورده کندنه آنچه به معنای مالی انتظار می رود.

حتی اگر نتایج خود را در آخرین لحظه قبل از خروج از بین ببرید ، هنوز هم می توانید با استفاده از دوبله هایی که با انتظارات مطابقت ندارد ، نتیجه بگیرید.

با استفاده از یک ماشین حساب یا محاسبه نتایج با دست ، 1. 40 * 165 = 231 دقیقاً. با این حال ، با استفاده از دو برابر داخلی ، در محیط کامپایلر / سیستم عامل من ، به عنوان یک عدد باینری نزدیک به 230. 99999 ذخیره می شود. بنابراین اگر شماره را کوتاه کنید ، به جای 231 230 دریافت می کنید. ممکن است دلیل آن را به جای کوتاه کردن نتیجه 231 به دست آورد. این درست است ، اما گرد کردن همیشه شامل کوتاه شدن است. هر تکنیک گرد که از آن استفاده می کنید ، هنوز شرایط مرزی مانند این وجود دارد که وقتی انتظار دارید که گرد شود ، دور می شوند. آنها به اندازه کافی نادر هستند که اغلب از طریق آزمایش یا مشاهده گاه به گاه پیدا نمی شوند. ممکن است برای جستجوی مثالهایی که نشان می دهد نتایج را نشان می دهد که همانطور که انتظار می رود رفتار نمی کنند ، بخواهید برخی از کد ها را بنویسید.

فرض کنید می خواهید چیزی را به نزدیکترین پنی دور کنید. بنابراین نتیجه نهایی خود را می گیرید ، 100 برابر می کنید ، 0. 5 اضافه کنید ، کوتاه کنید ، سپس نتیجه را با 100 تقسیم کنید تا به سکه ها برگردید. اگر شماره داخلی که ذخیره کرده اید 3. 46499999 بود. به جای 3. 465 ، وقتی شماره را به نزدیکترین پنی دور می کنید ، 3. 46 به جای 3. 47 دریافت می کنید. اما محاسبات پایه 10 شما ممکن است نشان دهد که پاسخ باید دقیقاً 3. 465 باشد که به وضوح باید تا 3. 47 دور باشد ، نه به 3. 46. این نوع اتفاقات گاهی اوقات در زندگی واقعی اتفاق می افتد وقتی از دو برابر برای محاسبات مالی استفاده می کنید. این نادر است ، بنابراین اغلب به عنوان یک مسئله غافل می شود ، اما اتفاق می افتد.

اگر از پایه 10 برای محاسبات داخلی خود به جای دو برابر استفاده می کنید ، پاسخ ها همیشه دقیقاً همان چیزی است که توسط انسان انتظار می رود ، با فرض اینکه هیچ اشکالی دیگر در کد شما وجود ندارد.

دنبال کردن پاسخ داده شده 12 سپتامبر 2012 ساعت 15:11 Randy D Oxentenko Randy D Oxentenko 985 6 6 نشان نقره 2 2 نشان برنز

مرتبط ، جالب: در کنسول JS Chrome من: Math. Round (. 4999999999999999): 0 Math. Round (. 499999999999999): 1

8 ژوئن 2015 در 17:26

این پاسخ گمراه کننده است. 1. 40 * 165 = 231. هر عدد غیر از دقیقاً 231 به معنای ریاضی اشتباه است (و همه حواس دیگر).

18 ژوئن 2015 در 9:37

karu فکر می کنم به همین دلیل رندی می گوید شناورها بد هستند. کنسول Chrome JS من 230. 99999999999997 را به عنوان نتیجه نشان می دهد. این اشتباه است ، که نکته ای در جواب است.

6 مارس 2016 در 3:48

Karu: IMHO جواب از نظر ریاضی اشتباه نیست. این فقط این است که 2 سوال وجود دارد که یک پاسخ داده می شود که این سؤال مطرح نمی شود. سؤالی که کامپایلر شما پاسخ می دهد 1. 39999999 * 164. 99999999 و غیره که از نظر ریاضی با 230. 99999 برابر است. بدیهی است که این سؤالی نیست که در وهله اول پرسیده شد.

15 مارس 2016 ساعت 9:36

curtisyallop زیرا این مقدار دو برابر به 0. 4999999999999999 می رسد 0. 5 چرا Math. round (0. 4999999999999994) بازگشت 1؟

21 فوریه 2018 در 8:56

من از برخی از این پاسخ ها مشکل دارم. من فکر می کنم دو برابر و شناورها در محاسبات مالی جایگاهی دارند. مطمئناً هنگام افزودن و تفریق مبالغ پولی غیر فرآیندی ، هنگام استفاده از کلاسهای عدد صحیح یا کلاسهای بزرگ ، از دست دادن دقت نخواهد بود. اما هنگام انجام عملیات پیچیده تر ، شما اغلب به نتیجه ای می رسید که چندین مکان اعشاری یا بسیاری از اعشاری را بیرون می کشد ، مهم نیست که چگونه شماره ها را ذخیره می کنید. مسئله این است که چگونه نتیجه را ارائه می دهید.

اگر نتیجه شما در مرز بین گرد و دور شدن و دور شدن است ، و آخرین پنی واقعاً مهم است ، احتمالاً باید به بیننده بگویید که جواب تقریباً در وسط است - با نمایش مکان های اعشاری بیشتر.

مشکل دو برابر و بیشتر با شناورها ، زمانی است که از آنها برای ترکیب تعداد زیاد و تعداد کمی استفاده می شود. در جاوا ،

System. out. println (1000000. 0f + 1. 2F - 1000000. 0f) ؛ 
1. 1875 

دنبال کردن 3 آوریل 2013 در ساعت 14:54 پاسخ داد Rob Scala Rob Scala 813 6 6 نشان نقره 4 4 نشان برنز

این. من در جستجوی همه پاسخ ها برای یافتن این واقعیت مربوطه بودم. در محاسبات عادی هیچ کس اهمیتی نمی دهد اگر از یک درصد از یک درصد برخوردار باشید ، اما در اینجا با تعداد زیاد به راحتی برخی از دلار در هر معامله گم می شوند!

8 اکتبر 2014 ساعت 12:05

و اکنون تصور کنید که کسی درآمد روزانه 0. 01 ٪ در 1 میلیون دلار خود را دریافت می کند - او هر روز چیزی نمی گیرد - و بعد از یک سال 1000 دلار دریافت نکرده است ، این مهم خواهد بود

8 اکتبر 2014 در 12:06

مشکل صحت نیست بلکه آن شناور به شما نمی گوید که نادرست می شود. یک عدد صحیح فقط می تواند تا 10 رقم را نگه دارد ، یک شناور می تواند تا 6 را نگه دارد بدون اینکه نادرست شود (وقتی مطابق آن برش می دهید). این اجازه می دهد این کار در حالی که یک عدد صحیح سرریز می شود و زبانی مانند جاوا به شما هشدار می دهد یا اجازه نمی دهد. هنگامی که از دو برابر استفاده می کنید ، می توانید به 16 رقم بروید که برای بسیاری از موارد استفاده کافی است.

7 نوامبر 2016 ساعت 16:33

Klaws از مشخصات شما متشکرم. احساس می کنم شروع به درک می کنم. اما من با قانون مالیات اروپا ناآشنا هستم و به این ترتیب گیج می شوم. آیا صحیح است که قیمت ها اغلب به عنوان "قیمت کاربر نهایی" (از جمله مالیات) نشان داده می شوند و فروشنده باید قیمت کاربر نهایی 0. 02 یورو را در نظر بگیرد ، که شامل 0. 017 یورو برای فروشنده و 0. 003 یورو مالیات است ، آن را ضرب کنید 1000برای دریافت 17. 00 یورو برای فروشنده و 3. 00 یورو مالیات؟این احساس عجیب است (از یک زمینه آمریکایی ، جایی که مالیات همیشه در پایان محاسبه می شود و هرگز در قیمت آگهی گنجانده نمی شود) ، جایی که احساس می کند مالیات 17. 00 یورو @19 ٪ باید 3. 23 یورو باشد. با تشکر!

29 نوامبر 2021 در 10:03

Josiah Yoder Vat قوانین در اتحادیه اروپا هستند. بغرنج. از زمان معرفی یورو ، سه مکان اعشاری اجباری است ، به این معنی که برنامه ها به طور معمول از 4 مکان اعشاری برای اطمینان از گرد شدن صحیح استفاده می کنند. قیمت های نشان داده شده معمولاً قیمت کاربر نهایی هستند ، اما به طور معمول به عنوان قیمت خالص ذخیره می شوند (به استثنای مالیات بر ارزش افزوده). مالیات بر ارزش افزوده در پایان هر تحویل در آلمان محاسبه می شود ، نه برای موارد جداگانه. من فکر می کنم هلند با این وجود اجازه می دهد مالیات را برای هر مورد محاسبه کرده و مبلغ این را در پایان اضافه کنید. برای پرداخت پیش بینی مالیات بر ارزش افزوده در آلمان ، قوانین مختلفی اعمال می شود (حتی در یک نقطه به صفر در یک نقطه).

1 دسامبر 2021 در ساعت 13:32

من خطر کم شدن را خطر می کنم ، اما فکر می کنم نامناسب شماره های نقطه شناور برای محاسبات ارز بیش از حد ارزیابی شده است. تا زمانی که اطمینان حاصل کنید که Cent-Round را به درستی انجام داده اید و رقم های قابل توجهی برای کار با آنها به منظور مقابله با عدم تطابق بازنمایی دودویی که توسط Zneak توضیح داده شده است ، دارید ، مشکلی نخواهد بود.

افرادی که با ارز در اکسل محاسبه می کنند ، همیشه از شناورهای دوتایی استفاده کرده اند (نوع ارز در اکسل وجود ندارد) و من هنوز کسی را ندیده ام که از خطاهای گرد شکایت کند.

البته ، شما باید در عقل بمانید. به عنوان مثال،یک صفحه وب ساده احتمالاً هرگز با شناورهای مضاعف مشکلی را تجربه نمی کند ، اما اگر به عنوان مثال انجام دهید. حسابداری یا هر چیز دیگری که نیاز به اضافه کردن تعداد بزرگ (نامحدود) شماره دارد ، نمی خواهید شماره های نقطه شناور را با قطب ده پا لمس کنید.

دنبال کردن در 20 ژانویه 2017 در ساعت 11:56 پاسخ داد اسکیتالوپرام اسکیتالوپرام 3،730 2 2 نشان های طلا 23 23 نشان نقره 24 24 نشان برنز این در واقع یک پاسخ بسیار مناسب است. در بیشتر موارد استفاده از آنها کاملاً خوب است. 11 دسامبر 2018 در 6:16

لازم به ذکر است که بیشتر بانکهای سرمایه گذاری مانند اکثر برنامه های C ++ از دو برابر استفاده می کنند. برخی از آنها طولانی استفاده می کنند اما بنابراین مشکل خود در مقیاس ردیابی است.

26 دسامبر 2018 در 9:11

من این جواب را جذاب می دانم. من فرض می کنم شما و peterlawrey از تجربه صحبت کنید. آیا می توان پیوندهای استنادها / وب را برای حمایت از ادعاهای خود پیدا کرد؟من برای یک واقعیت می دانم که شرکت ها از تجربه خودم از اطلاعات مالی در اکسل استفاده می کنند. اما در مورد بانکهای سرمایه گذاری با استفاده از دو برابر چیست؟

27 فوریه 2021 در 17:22

سیستم های معاملاتی JosiaHyoder به طور سنتی در C ++ نوشته شده است که استفاده از دقت دو یا ثابت متداول است. یعنی هیچ بزرگ. مشکلی که من با دقت ثابت دارم ، هزینه هر خطای بالقوه است. دو برابر احتمالاً کمتر از 1 سنت حتی در تجارت میلیارد دلاری است ، اما برای دقت ثابت ، می توانید با یک عامل 10 برابر یا بیشتر از آن خارج شوید.

1 مارس 2021 در 11:32

من برای اولین بار سالها پیش در معرض این مشکل قرار گرفتم که یک حسابدار گفت که آنها نمی توانند تفاوت یک درصد در کتاب ها را بپذیرند.

28 اوت 2021 در 3:13

شناورها و مضاعف ها تقریبی هستند. اگر یک bigDecimal ایجاد کرده و یک شناور را به سازنده منتقل کنید ، می بینید که شناور در واقع با چه چیزی برابر است:

groovy:000> new BigDecimal(1.0F) ===> 1 groovy:000> new BigDecimal(1.01F) ===>1. 0099999904632568359375 

این احتمالاً اینگونه نیست که شما می خواهید 1. 01 دلار نمایندگی کنید.

مشکل این است که مشخصات IEEE راهی برای نشان دادن دقیقاً همه کسری ها ندارد ، برخی از آنها به عنوان کسری تکرار می شوند ، بنابراین شما به خطاهای تقریب رسیدید. از آنجا که حسابداران دوست دارند دقیقاً به پنی بیایند و در صورت پرداخت صورتحساب خود ، مشتریان اذیت می شوند و پس از پردازش پرداخت ، آنها بدهکار هستند. انواع دقیقی مانند اعشار (در C#) یا java. math. bigdecimal در جاوا.

این طور نیست که در صورت دور زدن خطا قابل کنترل نباشد: این مقاله را توسط پیتر لری مشاهده کنید. در وهله اول فقط ساده تر نیست. بیشتر برنامه هایی که با پول اداره می شوند ، ریاضیات زیادی را فراخوانی نمی کنند ، عملیات شامل اضافه کردن چیزها یا اختصاص مبلغ به سطل های مختلف است. معرفی نقطه شناور و گرد کردن فقط چیزها را پیچیده می کند.

دنبال کردن در 16 سپتامبر 2010 در 19:29 پاسخ داد ناتان هیوز ناتان هیوز 93. 3K 19 19 نشان های طلا 179 179 نشان های نقره ای 272 272 نشان های برنز

شناور ، دوتایی و بزرگ مقادیر دقیق هستند. کد برای تبدیل شیء و همچنین سایر عملیات ها غیرقابل توصیف است. انواع خودشان ناشناخته نیستند.

17 مارس 2018 در 20:02

Chux: با استفاده از این ، من فکر می کنم شما این نکته را دارید که می تواند عبارت من بهبود یابد. من این را ویرایش می کنم و دوباره کلمه می کنم.

17 مارس 2018 در 22:32

به جای BigDecimal جدید (1. 01f) ، در عوض BigDecimal جدید ("1. 01") را امتحان کنید زیرا به عنوان مثال ، مشکل از خود BigDecimal ناشی نمی شود ، بلکه قسمت 1. 01f است. این 1. 01F به شما 1. 009999904632568359375 و BigDecimal Works خوب است.

24 آگوست 2022 در ساعت 13:20

Shark: من نمی توانم فکر کنم که شما نظر من را از دست داده اید؟البته BigDecimal خوب کار می کند. من هرگز به معنای تشویق مردم برای عبور از شناورها به BigDecimal نبودم ، این به عنوان یک تمرین بود. اگر این مشخص نیست و شما پیشنهادی برای بهبود این امر دارید ، از این استقبال می شود.

24 آگوست 2022 در 14:13

@NathanHughes no, i did not miss the point, and sorry for necroing it after 10 years, i just ran into it today from. some other unrelated place, saw it, and noticed the somewhat-misleading-but-correct groovy output. To improve on it, do try to add one more thing to it: groovy:000>BigDecimal جدید ("1. 01") و آن خروجی. این به افراد تازه کار کمک می کند که در واقع چیزی جز رشته ها (و BigDecimal به میزان بیشتری) می توانند اطلاعات دقیق و دقیقی را در مورد هر شماره اعشاری طولانی N-Any نگه دارند: D

24 آگوست 2022 در 14:16

در حالی که درست است که نوع نقطه شناور می تواند فقط داده های اعشاری تقریبی را نشان دهد ، همچنین صحیح است که اگر قبل از ارائه آنها تعداد به دقت لازم را دور کند ، نتیجه صحیح را بدست می آورد. معمولا.

معمولاً به این دلیل که نوع دوتایی از دقت کمتر از 16 شکل برخوردار است. اگر به دقت بهتری نیاز دارید ، نوع مناسبی نیست. همچنین تقریب ها می توانند جمع شوند.

باید گفت که حتی اگر از حسابی ثابت استفاده کنید ، هنوز هم باید شماره ها را دور کنید ، آیا این واقعیت نیست که در صورت بدست آوردن اعداد دوره ای ، Biginteger و BigDecimal خطایی می کنند. بنابراین در اینجا نیز تقریب وجود دارد.

به عنوان مثال COBOL ، که از لحاظ تاریخی برای محاسبات مالی استفاده می شود ، حداکثر دقت 18 شکل را دارد. بنابراین غالباً یک گرد و غضب وجود دارد.

نتیجه گیری ، به نظر من این دو برابر بیشتر به دلیل دقت 16 رقمی آن نامناسب است ، که می تواند کافی نباشد ، نه به این دلیل که تقریبی است.

خروجی زیر برنامه بعدی را در نظر بگیرید. این نشان می دهد که پس از دور زدن دو برابر ، نتیجه مشابه BigDecimal را تا Precision 16 می دهد.

دقت 14 ---------------------------------------------------------------- BigDecimalNoround: 56789. 012345 / 1111111111111 = گسترش اعشاری غیر فسخ ؛هیچ نتیجه اعشاری کاملاً نمایشی وجود ندارد.-------------------------------- BigDecimalNoround: 56789. 012345 / 111111111111 = گسترش اعشاری غیر خبره ؛هیچ نتیجه اعشاری کاملاً نمایشی وجود ندارد.-------------------------------- BigDecimalNoround: 56789. 012345 / 111111111111 = گسترش اعشاری غیر خبره ؛هیچ نتیجه اعشاری کاملاً نمایشی وجود ندارد.-------------------------------- BigDecimalNoround: 56789. 012345 / 111111111111 = گسترش اعشاری غیر خبره ؛هیچ نتیجه اعشاری کاملاً نمایشی وجود ندارد.-------------------------------- BigDecimalNoround: 56789. 012345 / 111111111111 = گسترش اعشاری غیر خبره ؛هیچ نتیجه اعشاری کاملاً نمایشی وجود ندارد.-------------------------------- BigDecimalNoround: 56789. 012345 / 111111111111 = گسترش اعشاری غیر خبره ؛هیچ نتیجه اعشاری کاملاً نمایشی وجود ندارد. 
واردات java. lang. reflect. invocationTargetException ؛وارد کردن java. lang. reflect. method ؛وارد کردن java. math. bigdecimal ؛وارد کردن java. math. mathcontext ؛تمرین کلاس عمومی>اعدام باطل استاتیک خصوصی (تست رشته ، مقدار رشته ، مقدار رشته ، دقت int) به صورت غیرقانونی ، SecurityException ، غیرقانونی AccessException ، InvocationTargetException ، nosuchmethodexcept را پرتاب می کندگرفتن (invocationTargetException e)System.out.println(String.format("%-30s: %s / %s = %s", test, amount, quantity, price));>رشته استاتیک عمومی DivideusingDoublenoround (مقدار رشته ، مقدار رشته ، دقت int)رشته استاتیک رشته DivideusingDouble (مقدار رشته ، مقدار رشته ، دقت int)رشته استاتیک عمومی DivideusingBigDecimal (مقدار رشته ، مقدار رشته ، دقت int)رشته استاتیک عمومی DivideUsingBigDecimalNoround (مقدار رشته ، مقدار رشته ، دقت int) < SPAN> قسمت خالی استاتیک خصوصی (تست رشته ، مقدار رشته ، مقدار رشته ، دقت int) به صورت غیرقانونی ، امنیت ، SecurityException ، InvocationTargetException ، nosuchmethodexception ، nosuchmethodexception ،> 
فارکس کاران ایران...
ما را در سایت فارکس کاران ایران دنبال می کنید

برچسب : نویسنده : ديناروند فهيمه بازدید : <-PostHit-> تاريخ : پنجشنبه 26 مرداد 1402 ساعت: 11:08