كانت هناك مشكلة عند التعامل مع التحقق من مبلغ الدفع في اليومين الماضيين. لقد استخدمت طريقة المساواة بين BigDecimal لمقارنة ما إذا كانت الكميتين متساوية ، مما أدى إلى خطأ في مقارنة المبلغ (مثل المقارنة بين 3.0 و 3.00 ، إلخ).
[ملاحظة: فيما يلي كل شيء عن Sun JDK الإصدار 1.4.2 كمثال. قد لا يكون تنفيذ الإصدارات الأخرى متسقة ، يرجى تجاهلها]
أولاً ، دعونا نلقي نظرة على طريقة BigDecimal المتساوية:
Boolean العام يساوي (الكائن X) {if (! (x مثيل من BigDecimal)) إرجاع خطأ ؛ BigDecimal XDEC = (BigDecimal) x ؛ return Scale == xDec.Scale && intval.equals (xdec.intval) ؛ }يمكنك أن ترى أن طريقة Euquals الخاصة بـ BigDecimal هي تحديد نوع البيانات أولاً المراد مقارنته. إذا كانت أنواع الكائنات متسقة ، فسيتم تحديدها في نفس الوقت ما إذا كانت الدقة (المقياس) والقيمة (طريقة متساوية BigInteger) متسقة.
في الواقع ، من الواضح جدًا بالفعل في Javadoc: "يقارن هذا الكائن الكبير مع الكائن المحدد للمساواة. على عكس المقارن ، فإن هذه الطريقة تعتبر كائنين كبيرتين متساويتين فقط إذا كانا متساويين في القيمة والحجم (وبالتالي 2.0 لا يساوي 2.00 عند مقارنته بهذه الطريقة)." أنا فقط لم أهتم!
لنلقي نظرة على طريقة المقارنة:
public int compareto (bigdecimal val) {/ * optimization: سوف يعمل بشكل جيد بدون الأسطر الثلاثة التالية */int sigdiff = signum () - val.Signum () ؛ if (sigdiff! = 0) return (sigdiff> 0؟ 1: -1) ؛ هذا ؛ arg [1] = val ؛ matchscale (arg) ؛ return arg [0] .intval.compareto (arg [1] .intval) ؛ } يمكنك أن ترى أن هناك معالجة مطابقة في هذه الطريقة ، مما يعني تحويل الكائن بدقة منخفضة إلى دقة عالية ، ثم مقارنته (أيضًا طريقة مقارنة BigInteger). تنفيذ MatchScale كما يلي:
private static void matchscale (BigDecimal [] val) {if (val [0] .scale <val [1] .scale) val [0] = val [0] .SetScale (val [1] .scale) ؛ else if (val [1] } قم بإجراء اختبار بسيط:
System.out.println (New BigDecimal ("1.2"). يساوي (BigDecimal جديد ("1.20"))) ؛ // الإخراج falsystem.out.println (جديد BigDecimal ("1.2"). المقارنة (جديد BigDecimal ("1.20")) == 0) ؛ // الإخراج صحيح لاحظت أيضًا أن المُنشئ الكبير في الأوتار قد مرت في سلاسل. إذا تم تمرير نوع الرقم ، ماذا سيحدث؟ يمكنك اختباره بنفسك وتحليل الأسباب:
System.out.println (New BigDecimal ("1.2"). يساوي (BigDecimal جديد ("1.20"))) ؛ // الإخراج falsystem.out.println (جديد BigDecimal ("1.2"). المقارنة (جديد BigDecimal ("1.20")) == 0) ؛ // الإخراج true system.out.println (جديد BigDecimal (1.2) .equals (جديد BigDecimal ("1.20"))) ؛ // الإخراج هل هو؟ system.out.println (جديد BigDecimal (1.2) .Compareto (جديد BigDecimal ("1.20")) == 0) ؛ // هو الإخراج؟ System.out.println (New BigDecimal (1.2) .equals (New BigDecimal (1.20))) ؛ // هو الإخراج؟ System.out.println (New BigDecimal (1.2) .Compareto (New BigDecimal (1.20)) == 0) ؛ // هو الإخراج؟الاستنتاج النهائي هو: لمقارنة حجم BigDecimal ، لن يقارن طريقة متساوين فقط حجم القيمة ، ولكن أيضًا مقارنة دقة الكائنين. لن تقارن طريقة المقارنة الدقة ، ولكنها تقارن حجم القيمة فقط.
أخيرًا ، احتقر نفسي. لقد استخدمت لغة جافا لسنوات عديدة ولم أحسب حتى الحس السليم!
تتحدث المقالة أعلاه لفترة وجيزة عن الفرق بين متساوين BigDecimal ومقارنة في Java هو كل المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.