इसे इंट (जावा) में बदलने के लिए एक डबल चक्कर लगाना


120

अभी मैं यह कोशिश कर रहा हूँ:

int a = round(n);

कहाँ nहै, doubleलेकिन यह काम नहीं कर रहा है। मैं क्या गलत कर रहा हूं?


के संभावित डुप्लिकेट stackoverflow.com/questions/153724/...
मैट गेंद

6
आपको अधिक विस्तार से "काम नहीं करना" वास्तव में विस्तृत करना चाहिए। क्या होता है? क्या नहीं होता है? आपने क्या उम्मीद किया? आपको क्या त्रुटियां मिलीं? क्या आपके पास एक round()ही कक्षा में एक विधि है? क्या आपने import static java.lang.Math.*? आदि .. संख्याओं को गोल करने के बहुत सारे तरीके हैं और इस प्रकार बहुत सारे संभावित उत्तर भी हैं। दूसरे शब्दों में, आपका प्रश्न अस्पष्ट और अस्पष्ट है और इसके वर्तमान रूप में यथोचित उत्तर नहीं दिया जा सकता है। यह अंधेरे में शूटिंग कर रहा है।
बालुस

1
क्या "काम नहीं करना" का मतलब निकटतम इंट की ओर नहीं, या अपवाद को फेंकना नहीं है, या ऊपर / नीचे चक्कर नहीं है? यह प्रश्न उत्तर के साथ संदर्भ को क्रॉस-रेफर किए बिना बेकार है।
modulitos

जवाबों:


239

round()स्निपेट में विधि का वापसी प्रकार क्या है ?

यदि यह Math.round()विधि है, तो इनपुट पैरा डबल होने पर यह एक लंबा रिटर्न देता है।

तो, आपको रिटर्न वैल्यू देनी होगी:

int a = (int) Math.round(doubleVar);

1
केवल एक इंट के लिए कास्टिंग के बजाय Math.toIntExact (लंबे) का उपयोग करने पर विचार करें; एक डबल काफी मानों को धारण कर सकता है और यदि आप अपनी अपेक्षा से दोगुना बड़ा है तो आप शायद सबसे महत्वपूर्ण बिट्स को चुपचाप फेंकना नहीं चाहते हैं।
othp

मेरा मानना ​​है कि कास्ट जरूरी नहीं है। मुझे पता नहीं है कि यह अतीत में था, लेकिन गोल इंट रिटर्न।
ड्रॉपआउट

यदि आप इसे एक फ्लोट देते हैं, और एक लंबा समय देते हैं, तो @Dropout Math.round एक इंट रिटर्न देता है।
Tur1ng

27

यदि आपको Math.round पसंद नहीं है (तो आप इस सरल दृष्टिकोण का उपयोग कर सकते हैं:

int a = (int) (doubleVar + 0.5);

4
पसंद न करने के लिए स्पष्ट रूप से कोई मूल्यवान कारण नहीं है Math.round(): stackoverflow.com/a/6468757/1715716
Gauthier Boaglio 22

3
यह समाधान छोटा है, आयात की आवश्यकता नहीं है और कई अन्य प्रोग्रामिंग भाषाओं में पोर्टेबल है जिसमें न्यूनतम परिवर्तन हैं। और यह आपके प्लेटफॉर्म के आधार पर और भी तेज़ हो सकता है: stackoverflow.com/questions/12091014/…
डॉ। डैनियल थम्स

1
मैं आपके उत्तर की आलोचना नहीं कर रहा हूं, जो आपके उल्लेख के कारण मुझे बहुत उपयोगी लगता है । मैं इस टिप्पणी से उन लोगों को संबोधित कर रहा था, जो उपयोग करने से डरते थे Math.round(), जो कि आपके द्वारा प्रदान किए गए समाधान के समान "शाब्दिक" है। चीयर्स।
गौथियर बोग्लियो

2
हां, जैसे नेह ने कहा, मेरा मानना ​​है कि यह उदाहरण के लिए -2.1 से -1 राउंड होगा।
बेन एरॉनसन

5
@AlbertoHormazabal, क्या आपने ध्यान नहीं दिया कि वह गयी 0.5?
साशा

11

गोलाई डबल "निकटतम" करने के लिए पूर्णांक इस तरह:

१.४ ->

१.६ ->

-2.1 -> -2

-1.3 -> -1

-1.5 -> -2

private int round(double d){
    double dAbs = Math.abs(d);
    int i = (int) dAbs;
    double result = dAbs - (double) i;
    if(result<0.5){
        return d<0 ? -i : i;            
    }else{
        return d<0 ? -(i+1) : i+1;          
    }
}

आप अपनी पसंद के अनुसार स्थिति (परिणाम <0.5) बदल सकते हैं।


मैं प्रतिद्वंद्वी के जवाब से सहमत हूं। लेकिन अगर आपको उच्चतम पूर्णांक संख्या के लिए बस गोल करने की आवश्यकता है, तो आप नीचे पसंद कर सकते हैं: डबल दशमलव = 4.56777; System.out.println (नया फ्लोट (Math.round (दशमलवनंबर))); आउटपुट: ५
स्माईट

3
import java.math.*;
public class TestRound11 {
  public static void main(String args[]){
    double d = 3.1537;
    BigDecimal bd = new BigDecimal(d);
    bd = bd.setScale(2,BigDecimal.ROUND_HALF_UP);
    // output is 3.15
    System.out.println(d + " : " + round(d, 2));
    // output is 3.154
    System.out.println(d + " : " + round(d, 3));
  }

  public static double round(double d, int decimalPlace){
    // see the Javadoc about why we use a String in the constructor
    // http://java.sun.com/j2se/1.5.0/docs/api/java/math/BigDecimal.html#BigDecimal(double)
    BigDecimal bd = new BigDecimal(Double.toString(d));
    bd = bd.setScale(decimalPlace,BigDecimal.ROUND_HALF_UP);
    return bd.doubleValue();
  }
}

3

Math.round फ़ंक्शन ओवरलोडेड है जब यह एक फ्लोट मान प्राप्त करता है, तो यह आपको एक इंट देगा। उदाहरण के लिए यह काम करेगा।

int a=Math.round(1.7f);

जब यह एक डबल मूल्य प्राप्त करता है, तो यह आपको एक लंबा समय देगा, इसलिए आपको इसे इंट में टाइप करना होगा।

int a=(int)Math.round(1.7);

यह परिशुद्धता के नुकसान को रोकने के लिए किया जाता है। आपका डबल मान 64 बिट है, लेकिन तब आपका इंट वैरिएबल केवल 32 बिट स्टोर कर सकता है, इसलिए यह सिर्फ इसे लॉन्ग में कनवर्ट करता है, जो 64 बिट है, लेकिन आप इसे 32 बिट पर टाइप कर सकते हैं जैसा कि ऊपर बताया गया है।


1

का दस्तावेजीकरण Math.roundकहता है:

एक करने के लिए तर्क गोलाई का परिणाम देता है पूर्णांक । परिणाम के बराबर है (int) Math.floor(f+0.5)

करने के लिए कोई जरूरत नहीं है int। शायद यह अतीत से बदल गया था।


4
2 Math.round विधियां हैं। जो फ्लोट लेता है वह पूर्णांक देता है, यह सही है। लेकिन जो दोहरा रिटर्न लेता है वह लंबा होता है।
डोमिनिक एह्रनबर्ग


-1

आपको वास्तव में अधिक पूर्ण उदाहरण पोस्ट करने की आवश्यकता है, इसलिए हम देख सकते हैं कि आप क्या करने की कोशिश कर रहे हैं। आपने जो पोस्ट किया है, उससे मैं यहां देख सकता हूं। सबसे पहले, कोई अंतर्निहित round()पद्धति नहीं है। आपको या तो कॉल करने की जरूरत है Math.round(n), या स्टैटिकली इम्पोर्ट करने की Math.round, और फिर इसे अपने जैसे कॉल करें।


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