سؤال

أدرك أن BigDecimal يوصى به كأفضل ممارسة لتمثيل القيم النقدية في Java.ماذا تستخدم؟هل هناك مكتبة أفضل تفضل استخدامها بدلاً من ذلك؟

هل كانت مفيدة؟

المحلول

BigDecimal طوال الطريق.لقد سمعت عن بعض الأشخاص الذين قاموا بإنشاء منتجاتهم الخاصة Cash أو Money الطبقات التي تغلف القيمة النقدية بالعملة، ولكن تحت الجلد لا تزال BigDecimal, ربما مع BigDecimal.ROUND_HALF_EVEN التقريب.

يحرر: كما يذكر دون في إجابته, ، هناك مشاريع مفتوحة المصدر مثل الوقت والمال, ، وبينما أشيد بهم لمحاولتهم منع المطورين من الاضطرار إلى إعادة اختراع العجلة، إلا أنني لا أملك ثقة كافية في مكتبة ما قبل ألفا لاستخدامها في بيئة الإنتاج.علاوة على ذلك، إذا قمت بالحفر أسفل الغطاء، فسوف ترى هم يستخدمون BigDecimal أيضاً.

نصائح أخرى

ويمكن أن يكون مفيدا للناس وصوله الى هنا من قبل محركات البحث لمعرفة JodaMoney: HTTP: // شبكة الاتصالات العالمية .joda.org / joda المال / .

وأنا لا يعبر عن رأيي هنا، ولكن هناك حجج وجيهة جدا ضد BigDecimal أن شخصا ما ربما يجب رمي بها:

http://lemnik.wordpress.com/2011 / 03/25 / bigdecimal والخاص بك بين المال /

مكتبة مريحة أنني واجهت في وقت سابق هي مكتبة Joda الأموال . واحد من التطبيقات التي تستند في الواقع على BigDecimal. لأنه يقوم على ISO-4217 مواصفات للحصول على العملات ويمكن أن تدعم لائحة العملة مخصصة (المحملة عبر CVS).

وهذه المكتبة لديها عدد قليل من الملفات التي يمكن للمرء أن يذهب بسرعة من خلال حال الحاجة الى تعديلات. يتم نشر Joda الأموال تحت رخصة أباتشي 2.0.

إذا كنت تستخدم فقط الدولارات والسنتات، فما استقاموا لكم فاستقيموا استخدام طويلة (يقابله 2 عشرية). اذا كنت بحاجة الى مزيد من التفاصيل، قد يكون عشري كبير وسيلة للذهاب.

وفي كلتا الحالتين، كنت على الارجح تمديد فئة لديها .toString () يستخدم بالشكل الصحيح، وكمكان لوضع الطرق الأخرى التي قد تأتي (لفترة طويلة، التكاثر وسوف الفاصل تنحرف عن مسارها إذا لا يتم ضبط عشري)

وأيضا، إذا كنت تستخدم تعريف الفئة الخاصة بك واجهة، ثم يمكنك استبدال التنفيذ في الإرادة.

وBigDecimal أو بأخرى تمثيل نقطة ثابتة غير ما هو مطلوب عموما من أجل المال.

ونقطة عائمة (Double، Float) تمثيل وحسابات غير دقيقة، مما يؤدي إلى نتائج خاطئة.

وعليك أن تكون حذرا جدا عند التعامل مع الوقت والمال.

وعندما كنت تعمل مع المال، وآمل الجميع يجب أن يعرف أبدا إلى استخدام تعويم أو مزدوج.

ولكن أنا غير متأكد حول BigDecimal.

في معظم الحالات سوف يكون على ما يرام فقط إذا كنت تتبع سنتا في صحيح أو طويل. وبهذه الطريقة يمكنك أبدا التعامل مع منزلة عشرية.

ويمكنك عرض دولارات فقط عند طباعته. تعمل دائما مع سنتا الأعداد الصحيحة باستخدام الداخلية. قد يكون هذا صعبا إذا دعت الحاجة لتقسيم أو تحتاج إلى استخدام Math.abs ().

ومع ذلك، قد الرعاية نصف قادرا على المائة، أو حتى مائة واحد من المائة. أنا لا أعرف ما هو وسيلة جيدة للقيام بذلك. قد تحتاج فقط للتعامل مع آلاف من سنت واستخدام لفترة طويلة. أو ربما سوف تضطر إلى استخدام BigDecimal

وأود أن تفعل الكثير مزيد من القراءة حول هذا الموضوع، ولكن تجاهل الجميع الذي يبدأ الحديث حول استخدام تعويم أو مزدوج لتمثيل المال. أنها مجرد يسأل عن المتاعب.

وأشعر نصيحتي ليست كاملة، لذلك يرجى وضع أكثر على الرغم من فيه. كنت تتعامل مع أنواع خطيرة!

وخلق فئة المال هو وسيلة للذهاب. باستخدام BigDecimal (أو حتى عدد صحيح) تحتها. ثم استخدام الطبقة العملات لتعريف اتفاقية التقريب.

ومما يؤسف له دون إثقال مشغل جافا يجعل من غير سارة للغاية خلق مثل هذه الأنواع الأساسية.

وهناك مكتبة أفضل، timeandmoney . IMO، فإنه أفضل بكثير من المكتبات التي تقدمها JDK لتمثيل هذه المفاهيم 2.

وبالتأكيد لا BigDecimal. هناك الكثير من قواعد خاصة لتقريب وعرض أن لديك ما يدعو للقلق.

وتوصي مارتن فاولر تنفيذ فئة لتمثيل كميات العملة، والتي كما تنفذ قواعد لتحويل العملة.

ويا، وهنا مقالة مثيرة جدا للاهتمام على BigDecimal، ومثالا توضيحيا لماذا في بعض الأحيان يتم استخدامه بدلا من الزوجي. BigDecimal دروس .

ويمكنك استخدام فئة DecimalFormat عند عرض في نهاية المطاف قيمة العملة. ويوفر الدعم التعريب وللمد جميلة.

وأود أن تغلف BigDecimal في الصف الأموال التي لديها أيضا العملة كما شخص ما ذكر أعلاه. والشيء المهم هو أن لديك مبلغ المدقع من وحدة الاختبارات وخصوصا إذا كان يعمل مع بعملات مختلفة. كما انها فكرة جيدة إذا قمت بإضافة منشئ كنفينينت التي تأخذ سلسلة أو أسلوب المصنع الذي يفعل نفس الشيء بحيث يمكنك كتابة الاختبارات الخاصة بك شيء من هذا القبيل:

   assertEquals(Money.create("100.0 USD").add("10 GBP"),Money.create("116 USD"));

وهناك دائما القيود وتفاصيل المعنية. أي شخص من دون خبرة كافية لتقدير قضايا خفية المبينة في المادة التالية يجب إعادة النظر بجدية قبل التعامل مع البيانات المالية في العالم الحقيقي:

http://lemnik.wordpress.com/2011/ 25/3 / bigdecimal والخاص بك بين المال

وBigDecimal يكاد يكون التمثيل الصحيح الوحيد أو القطعة الوحيدة من اللغز. ظروف معينة معينة، باستخدام فئة المال مدعومة سنتا تخزينها كعدد يمكن أن يكون كافيا وسيكون أسرع بكثير من BigDecimal. نعم، وهذا يعني استخدام الدولارات كما كميات العملة وحدود ولكن هذه القيود مقبولة تماما بالنسبة لكثير من حالات الاستخدام وجميع العملات لديها حالات خاصة لتقريب والطوائف الفرعية على أي حال، لذلك ليس هناك "عالمية" حل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top