أسرع طريقة كفاءة لتحديد القيمة العشرية هي عدد صحيح في جافا

StackOverflow https://stackoverflow.com/questions/1575052

  •  21-09-2019
  •  | 
  •  

سؤال

إعطاء متغير مزدوج اسمه sizeValue و sizeValue يحتوي على شيء آخر غير 0 ، ما هي الطريقة الأكثر فعالية لتحديد ذلك sizeValue يحتوي على قيمة عدد صحيح؟

حاليا أنا أستخدم

SizeValue ٪ 1 == 0

أي طرق أسرع أخرى؟

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

المحلول

جرب Math.Ceil:

private static boolean isInt(double x) {
     return x == Math.ceil(x);
}

تعديل

لقد قمت ببعض المعايير مع الطرق التالية:

private static boolean isInt1(double x) {
    return x == (int) x;
}

private static boolean isInt2(double x) {
    return x == Math.ceil(x);
}

private static boolean isInt3(double x) {
    return x % 1 == 0;
} 

isInt1 هل أسرع منهم (على Sunjre 1.6)

نصائح أخرى

لست متأكدًا مما إذا كان ذلك أسرع ، ولكن يمكنك إلقاء مضاعفة على int واختبار المساواة:

double d = 123.456;
boolean dIsAnInteger = (d == (int)d);

تحذير: هل تفكر 0.9999999999999999 عدد صحيح؟ على الاغلب لا. لكن شاهد هذا:

double val = 0;
for(int i=0;i<10;i++)
    System.out.println(val+=0.1);

هذا يطبع:

0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999

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

لذلك سأجعل طريقتي أبطأ قليلاً (ولكن أكثر صحة) من خلال دمج دلتا مثل جونيت يفعل:

private static boolean isInt(double x, double delta) {
    double ceil = Math.ceil(x);
    return x-delta<ceil && x+delta>ceil;
}

وبالطبع توفير نفس الطريقة مع افتراضي معقول:

private static boolean isInt(double x) {
    return isInt(x, 0.000000001);
}

الآن isInt(val) أخيرًا يعود صحيح.

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