परीक्षण कैसे करें यदि एक डबल पूर्णांक है


165

क्या इसे करना संभव है?

double variable;
variable = 5;
/* the below should return true, since 5 is an int. 
if variable were to equal 5.7, then it would return false. */
if(variable == int) {
    //do stuff
}

मुझे पता है कि कोड शायद ऐसा कुछ भी नहीं करता है, लेकिन यह कैसे जाता है ?


1
C # लेकिन जावा में समान: stackoverflow.com/a/4077262/284240 ( Integer.MAX_VALUE )
टिम श्मेल्टर

1
इससे आपको क्या लाभ होगा? doubleऔर intस्मृति में अलग तरह से प्रतिनिधित्व किया जाता है, और आप अपनी मेमोरी हैंडलिंग के संदर्भ के आधार पर एक या दूसरे का उपयोग करेंगे।
मकोतो

@Lendend, जैसा आपने सुझाव दिया था, मैंने वैसा ही किया होगा; क्या आप संयोग से जानते हैं कि% 1 दक्षता-वार की तुलना Math.floor (वैरिएबल) से कैसे करता है जो अन्य उपयोगकर्ता सुझाते हैं?
जी। बछ

3
@ माकोतो यह एक कार्यक्रम है जो पाइगोरटियन ट्राइएप्स को खोजने के लिए है। स्क्वायर की जड़ें कभी-कभी दोहरी हो सकती हैं, लेकिन साथ ही वे कभी-कभी अंतर हो सकते हैं। तुम्हें मेरा मतलब पता है?
JXPheonix

@JXPheonix: तो मान या तो एक फ़्लोटिंग-पॉइंट मान या पूर्णांक मान हो सकते हैं। समझ में आता है।
मकोतो

जवाबों:


146
if ((variable == Math.floor(variable)) && !Double.isInfinite(variable)) {
    // integer type
}

यह जाँचता है कि क्या डबल का गोल-डाउन मूल्य डबल के समान है।

आपके चर का एक अंतर या दोहरा मूल्य हो सकता है और Math.floor(variable)हमेशा एक अंतर मूल्य होता है, इसलिए यदि आपका चर बराबर है Math.floor(variable)तो इसका एक अंतर मान होना चाहिए।

यह तब भी काम नहीं करता है जब चर का मान अनंत या नकारात्मक हो, इसलिए 'जब तक परिवर्तनशील नहीं होता, तब तक' को जोड़ना शर्त के अनुसार नहीं है।


3
"यदि तर्क NaN या अनंत या सकारात्मक शून्य या नकारात्मक शून्य है, तो परिणाम तर्क के समान है।" docs.oracle.com/javase/6/docs/api/java/lang/…
टिम श्मेल्टर

2
@TimSchmelter: अच्छी पकड़। यह भी ध्यान देने योग्य है कि NaN कुछ भी समान नहीं है (स्वयं सहित) लेकिन +/- Inf स्वयं के बराबर है - इसलिए दो किनारे मामले हैं!
मैरिक्स

स्कोन और फौड दोनों ने बहुत बेहतर उत्तर पोस्ट किए।
जोएल क्रिस्टोफेल

@JoelChristophel: मैं सहमत नहीं हूँ। यह एक अच्छा तरीका है क्योंकि यह प्रकार के अतिप्रवाह के जोखिम को समाप्त करता है। केवल एक चीज जो मुझे पसंद नहीं थी, वह यह थी कि intयदि ifमूल्यांकन किया जाए तो चर एक चर था true
बाथशीबा

@ बाथशीबा (Double.POSITIVE_INFINITY% 1) == 0 और इसके नकारात्मक समकक्ष दोनों ही झूठे का मूल्यांकन करते हैं।
जोएल क्रिस्टोफेल

222

या आप modulo ऑपरेटर का उपयोग कर सकते हैं:

(d % 1) == 0


2
मैं वास्तव में इस समाधान की सादगी से प्यार करता हूं। इसे पढ़ना और लागू करना दोनों आसान है।
क्रिस्पी

1
बहुत सहज समाधान
डैनियल सैन

3
गणना के संदर्भ में, क्या यह तेजी से है Math.rint(d)?
iTurki

2
हां यह अच्छा है, लेकिन ध्यान दें कि यह एक जावा समाधान है और dसी और सी ++ में नकारात्मक के लिए अच्छी तरह से परिभाषित नहीं है।
बतशेबा

4
सोनार में, यह एक मुद्दा पैदा करता है "समानता परीक्षण फ्लोटिंग पॉइंट वैल्यू के साथ नहीं किया जाना चाहिए।"
जूलियो डी।

86

अमरूद: DoubleMath.isMathematicalInteger। (प्रकटीकरण: मैंने इसे लिखा है।) या, यदि आप पहले से ही अमरूद का आयात नहीं कर रहे हैं, x == Math.rint(x)तो यह करने का सबसे तेज़ तरीका है; rintऔसत से floorया इससे भी तेज है ceil


3
Math.rint के बारे में नहीं जानते थे कि आप सही हैं। यह Math.floor
Lenny Markus

क्या यह किसी तरह Eng.Fouad के कास्टिंग उदाहरण के लिए बेहतर है?
जोएल क्रिस्टोफेल

@JoelChristophel: हाँ। पूर्णांक मानों के साथ सभी डबल्स इंट की श्रेणी में नहीं हैं, या लंबे समय तक भी हैं, ताकि परीक्षण उन पर काम न करें।
लुई वासरमैन

पकड़ लिया। तब (d% 1) == 0 अभी भी मान्य है।
जोएल क्रिस्टोफेल


6

इस तरह आजमाएं,

public static boolean isInteger(double number){
    return Math.ceil(number) == Math.floor(number); 
}

उदाहरण के लिए:

Math.ceil(12.9) = 13; Math.floor(12.9) = 12;

इसलिए 12.9 है नहीं , फिर भी पूर्णांक

 Math.ceil(12.0) = 12; Math.floor(12.0) =12; 

इसलिए 12.0 पूर्णांक है


3

यहाँ के लिए एक संस्करण है Integerऔर Double:

    private static boolean isInteger(Double variable) {
    if (    variable.equals(Math.floor(variable)) && 
            !Double.isInfinite(variable)          &&
            !Double.isNaN(variable)               &&
            variable <= Integer.MAX_VALUE         &&
            variable >= Integer.MIN_VALUE) {
        return true;
    } else {
        return false;
    }
}

में परिवर्तित करने के Doubleलिए Integer:

Integer intVariable = variable.intValue();

3

विचार करें:

Double.isFinite (value) && Double.compare (value, StrictMath.rint (value)) == 0

यह कोर जावा से चिपक जाता है और फ्लोटिंग पॉइंट वैल्यू ( ==) के बीच एक समानता की तुलना से बचता है जो बुरा माना जाता है। यह isFinite()आवश्यक है क्योंकि rint()अनंत मूल्यों से गुजरना होगा।



3

यहाँ एक अच्छा समाधान है:

if (variable == (int)variable) {
    //logic
}

(bool)कास्ट क्यों ?
xdavidliu

1
@xdavidliu उसके लिए कोई ज़रूरत नहीं है। हम इसे अनदेखा कर सकते हैं।
नीतीश

2

ऊपर SkonJeet के उत्तर के समान है, लेकिन प्रदर्शन बेहतर है (कम से कम जावा में):

Double zero = 0d;    
zero.longValue() == zero.doubleValue()

1
public static boolean isInteger(double d) {
  // Note that Double.NaN is not equal to anything, even itself.
  return (d == Math.floor(d)) && !Double.isInfinite(d);
}

एक अधिक सही कार्यान्वयन गलत वापस आ जाएगा और आपको एक और विधि लिखनी होगी जो तर्क के रूप में int लेती है और सच होती है। : डी
अल्फा

0

आप इस तरह से कोशिश कर सकते हैं: डबल का पूर्णांक मान प्राप्त करें, इसे मूल डबल मान से घटाएं, एक गोलाई सीमा और परीक्षणों को परिभाषित करें यदि नया डबल मान (पूर्णांक भाग के बिना) की पूर्ण संख्या आपके से बड़ी या छोटी है परिभाषित सीमा। यदि यह छोटा है, तो आप इसका इरादा कर सकते हैं यह पूर्णांक मान है। उदाहरण:

public final double testRange = 0.2;

public static boolean doubleIsInteger(double d){
    int i = (int)d;
    double abs = Math.abs(d-i);
    return abs <= testRange;
}

यदि आप मान 33.15 d को वापस लेते हैं, तो विधि सही है। बेहतर परिणाम पाने के लिए आप अपने विवेक पर testRange (0.0002 के रूप में) को कम मान असाइन कर सकते हैं।


0

व्यक्तिगत रूप से, मैं स्वीकृत उत्तर में सरल मोडुलो ऑपरेशन समाधान पसंद करता हूं। दुर्भाग्य से, सोनारक्यूब एक गोल परिशुद्धता स्थापित किए बिना फ्लोटिंग बिंदुओं के साथ समानता परीक्षण पसंद नहीं करता है। इसलिए हमने एक अधिक आज्ञाकारी समाधान खोजने की कोशिश की है। यह रहा:

if (new BigDecimal(decimalValue).remainder(new BigDecimal(1)).equals(BigDecimal.ZERO)) {
    // no decimal places
} else {
    // decimal places
}

Remainder(BigDecimal)BigDecimalजिसका मूल्य है, लौटाता है (this % divisor)। यदि यह शून्य के बराबर है, तो हम जानते हैं कि कोई अस्थायी बिंदु नहीं है।



हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.