سؤال

في آخر تمرين بروس إيكيل، يتطلب الرمز الذي كتبته طريقة وتغيير القيمة في فئة أخرى. هنا هو رمزي:

class Big {
  float b;
}

public class PassObject {
  static void f(Letter y) {
    y.c = 'z';
  } //end f()
  static void g(Big z) {
    z.b = 2.2;
  }

  public static void main(String[] args ) {
    Big t = new Big();
    t.b = 5.6;
    System.out.println("1: t.b : " + t.b);
    g(x);
    System.out.println("2: t.b: " + t.b);
  } //end main
}//end class

إنه يرمي خطأ يقول "فقدان الدقة المحتملة".

PassObject.java:13: possible loss of precision
found: double
required : float   z.b = 2.2
passobject.java:20: possible loss of precision
found : double
required : float   t.b = 5.6

لا doubles يكون floatS كذلك؟

شكرا لك مقدما

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

المحلول

نعم، ولكن عليك تحديد أنهم يطفوون، وإلا يتم التعامل معها على أنها الزوجي:

z.b = 2.2f

"F" في نهاية الرقم يجعلها تعويم بدلا من ضعف.

لن يضيق جافا تلقائيا مزدوجا إلى تعويم.

نصائح أخرى

لا، يمكن أن تكون العوامات عملية إصدارات تلقائيا للتضاعف، ولكن لا يمكن أن يطفو الزوجي أبدا دون صب صريح لأن الزوجي لها مجموعة أكبر.

مجموعة تعويم هو 1.40129846432481707e-45 ل 3.40282346638528860e+38

المدى المزدوج هو 4.94065645841246544e-324d ل 1.79769313486231570e+308d

افتراضيا، ستعامل Java علاج عشري (مثل "4.3") ك double إلا إذا قمت بتحديد خلاف ذلك float عن طريق إضافة F بعد الرقم (على سبيل المثال "4.3f").

كنت تواجه نفس المشكلة في كلا الخطوط. أولا، يتم تفسير الحرف العشري على أنه مزدوج من المحول البرمجي. ثم يحاول تعيينه b, ، وهو نوع من النوع float. وبعد منذ أ double هو 64 بت و float هو فقط 32 بت (انظر وثائق جافا البدائية)، يمنحك Java خطأ يشير إلى أن float لا يمكن أن يصلح داخل double. وبعد الحل هو إضافة F إلى حرفي العشري.

إذا كنت تحاول أن تفعل العكس (أي تعيين float إلى أ double)، سيكون ذلك بخير لأنه يمكنك تناسب float32 بت ضمن double64.

لا تستخدم تعويم. لا يوجد سبب وجيه تقريبا لاستخدامه ولم يكن لأكثر من عقد من الزمان. مجرد استخدام مزدوج.

can't doubles be floats as well?

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

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

منطقة واحدة غالبا ما تسبب ترتبيبات الحسابات، لأن هذه "اتسعت" ضمنيا إلى INT لأسباب تقنية. لذلك إذا قمت بضرب اثنين من السراويل القصيرة ومحاولة تعيين النتيجة لفترة قصيرة، فسوف يشكو المحول البرمجي لأن نتيجة الحساب هي Int.

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

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