مقدمة إلى BigDecimal
التفسير الوارد في وثيقة JDK (الصينية) كما يلي:
غير قابل للتغيير ، موقّع عدد عشري من الدقة التعسفية. يتكون BigDecimal من قيمة غير صحيحة من أي دقة ومقياس عدد صحيح 32 بت. إذا كان صفرًا أو إيجابيًا ، فإن المقياس هو عدد الأرقام بعد النقطة العشرية. إذا كان الرقم السالب ، اضرب القيمة غير المقيدة للرقم بموجب طاقة مقياس سلبية قدرها 10. وبالتالي ، فإن القيمة التي يمثلها BigDecimal هي (UncaledValue × 10-scale).
شرح محدد
1. "قيمة الكائن الكبير غير قابلة للتغيير". هذا يوضح هذه الميزة في وظيفة التشغيل للكائن BigDecimal:
نسخة الكود كما يلي: BigDecimal A = New BigDecimal ("1.22") ؛
System.out.println ("بناء مع قيمة السلسلة:" + a) ؛
BigDecimal B = New BigDecimal ("2.22") ؛
A.Add (B) ؛
System.out.println ("A Plus B IS:" + A) ؛
من السهل التفكير في أنه سوف يخرج:
بناء مع stringValue: 1.22
A Plus B هو: 3.44
ولكن في الواقع A Plus B هو: 1.22
2. "يتكون BigDecimal من قيمة غير صحيحة من أي دقة ومقياس عدد صحيح 32 بت. إذا كانت قيمة المقياس صفرًا أو إيجابيًا ، فإن المقياس هو عدد الأرقام بعد النقطة العشرية." يمكن قراءة هذه الجملة مثل هذا:
على سبيل المثال: -12 و 13.412
معبر عنها: -12 × 10-0 و 13412 × 10-3
هنا (القيم والمقاييس غير المقيدة) ممثلة على النحو التالي: [-12 ، 0] و [13412 ، 3] على التوالي
3. "إذا كانت قيمة المقياس عبارة عن رقم سالب ، اضرب القيمة غير المقيدة للرقم بموجب طاقة مقياس سلبي قدرها 10". يمكن قراءة هذه الجملة مثل هذا:
على سبيل المثال: 120.00
يتم التعبير عن هذه القيمة على النحو التالي: 12000 × 10-2
هنا (قيمة وحجم غير مقياس) يتم التعبير عنها على النحو التالي: [12000 ، 2]
لا تزال قيمة المقياس هنا إيجابية 2 ، ولكن تنفيذ العمليات التالية:
BigDecimal Cause = جديد BigDecimal ("-120.00") ؛
// إرجاع BigDecimal Rumerical مساوية لهذا العشرية ، ولكنه يزيل جميع الأصفار الذيل من هذا التمثيل.
المبلغ = المبلغ. striptrailingzeros () ؛
يتم التعبير عن هذه القيمة على النحو التالي: 12 × 10-(-1)
هنا (قيمة وحجم غير مقياس) يتم التعبير عنها على النحو التالي: [12 ، -1]
ملاحظات على استخدام
1. مُنشئ
نسخة الكود كما يلي: BigDecimal adouble = new BigDecimal (1.22) ؛
System.out.println ("بناء بقيمة مزدوجة:" + adouble) ؛
BigDecimal astring = new BigDecimal ("1.22") ؛
system.out.println ("بناء مع قيمة السلسلة:" + astring) ؛
نتيجة الإخراج على النحو التالي:
بنية مع القيمة المزدوجة: 1.2199999999999999999999733546474089962430298328399658203125
بناء بقيمة السلسلة: 1.22
وصف JDK:
أ) لا يمكن التنبؤ بنتائج طريقة البناء بنوع المعلمة المزدوج. قد يظن بعض الناس أن BigDecimal التي تم إنشاؤها عن طريق كتابة NewbigDecimal (0.1) في Java تساوي تمامًا 0.1 (قيمة غير تقليدية 1 ، والتي يكون مقياسها 1) ، ولكنها تساوي في الواقع 0.1000000000000000000000000055511512312570211815834041515625. وذلك لأنه لا يمكن التعبير عن 0.1 بدقة كضاعفة (أو لهذه الحالة لا يمكن التعبير عنها كأي عشري ثنائي الطول محدود). وبهذه الطريقة ، لن تكون القيمة التي تم تمريرها في طريقة البناء مساوية تمامًا لـ 0.1 (على الرغم من أنها تساوي هذه القيمة).
ب) من ناحية أخرى ، فإن مُنشئ السلسلة يمكن التنبؤ به تمامًا: الكتابة إلى Newbigdecimal ("0.1") ستنشئ BigDecimal ، وهو بالضبط 0.1 المتوقع. لذلك ، بالمقارنة ، يوصى بشكل عام باستخدام مُنشئ السلسلة أولاً.
ج) عندما يجب استخدام المزدوج كمصدر لـ BigDecimal ، لاحظ أن هذا المُنشئ يوفر تحويلًا دقيقًا ؛ لا يوفر نفس النتيجة: أولاً استخدم طريقة Double.ToString (مزدوجة) ، ثم استخدم مُنشئ BigDecimal (سلسلة). لتحويل Double إلى String ، يمكنك أيضًا استخدام طريقة String Static: String.Valueof (double).
2. العملية. بالإضافة إلى ذلك ، فإن الطرح والضرب والتقسيم في الواقع يعيد كائنًا كبيرًا جديدًا ، لأن BigDecimal غير قابل للتغيير ، وسيتم إنشاء كائن جديد عند أداء كل خطوة من التشغيل ، لذلك A.ADD (B) ؛ على الرغم من إجراء عملية الإضافة ، لا يحفظ A القيمة بعد عملية الإضافة. يجب أن يكون الاستخدام الصحيح A = A.Add (B) ؛
مثال:
تحديد ما إذا كان الكائن BigDecimal هو عدد صحيح:
انسخ الرمز على النحو التالي: isIntegerValue الخاص المنطقي (BigDecimal BD) {
إرجاع bd.signum () == 0 || bd.scale () <= 0 || bd.striptrailingzeros (). Scale () <= 0 ؛
}
لماذا هذا؟ الرجاء اختبار المثال التالي:
انسخ الرمز على النحو التالي: BigDecimal must = new BigDecimal ("-120.00") ؛ // يرجى تجربة "0" ، "0.00" ، "1.00" ، "10.00" و "10.10" على التوالي على التوالي
System.out.println (come.signum ()) ؛ // إيجابية وسلبية
System.out.println (come.scale ()) ؛ //حجم
System.out.println (come.striptrailingzeros (). Scale ()) ؛ // مقياس بعد الصفر
المرجع: الطبقة الكبيرة