2011-12-05 10 views

उत्तर

19

मैं नहीं मानता मानक पुस्तकालय इस तरह के एक समारोह है।

समस्या

है कि आप बहुत अलग व्यवहार (गणितीय बोल) के लिए पूछ रहे हैं कि क्या संख्या बड़ा या 0 से छोटी है पर निर्भर करता है (यानी ऋणात्मक मानों के लिए साइन अप गोलाई, सकारात्मक मूल्यों के लिए नीचे गोलाई)

पीछा कर रहा है विधि का इस्तेमाल किया जा सकता है:

public double myRound(double val) { 
    if (val < 0) { 
     return Math.ceil(val); 
    } 
    return Math.floor(val); 
} 
+1

+1: एकमात्र उत्तर अब तक सही चीज़ (AFAICS) करता है। –

0

ऐसा लगता है कि आप हमेशा गोल-डाउन करना चाहते हैं? आप Math.floor बजाय

public static double floor(double a)

सबसे बड़ा (सकारात्मक अनंत के लिए निकटतम) डबल मूल्य कि तर्क से बड़ा नहीं है और एक गणितीय पूर्णांक के बराबर है रिटर्न उपयोग कर सकते हैं। विशेष मामले:

+8

'Math.floor()' राउंड की तरफ अनंतता, शून्य नहीं। –

5

सिर्फ int के लिए कास्टिंग आपके लिए ऐसा करेगा?

संपादित करें: आप एक डबल बनाए रखने के लिए चाहते हैं, तो इस बस पर्याप्त काम करना चाहिए:

if (val < 0) 
    return -Math.floor(-val); 
else 
    return Math.floor(val); 

और बस लोग हैं, जो नि: शुल्क कोड शाखा और लगता है थोड़ा अधिक चतुर चाहते हैं के लिए:

long tmp = Double.doubleToLongBits(val); 
tmp >>>= 63; 
return Math.floor(val) + tmp; 
+3

प्रदान किया गया परिणाम एक 'int' में फिट बैठता है, जो कि बड़ा हो सकता है। – NPE

+1

@aix पर्याप्त सच है, लेकिन फिर आप यह भी गारंटी नहीं दे सकते कि वहां एक डबल मौजूद है जो संख्या का प्रतिनिधित्व कर सकता है। लेकिन हाँ, जो मेरी तरफ नाइटपिक कर रहा है;) – Voo

0

BigDecimal कई rounding options प्रदान करता है। इस तरह लंबे समय तक के लिए

+0

विशेष रूप से, यह ओपी की आवश्यकता को हल करने के लिए नीचे होगा जो कि फ्लोर से भिन्न है, सही गणितीय व्यवहार का पालन करता है। – demongolem

9

डाली:

float x= 1.9; 

long y = (long)x; 

यह शून्य की ओर सकारात्मक और नकारात्मक दोनों संख्या दौर।

+2

परिणामस्वरूप 'int' में फिट बैठता है, जो – NPE

+1

पर बड़ा हो सकता है, तो आप 'int' पर क्यों डालेंगे और उसे' लंबे' में स्टोर करेंगे? एक 'लंबे' तक कास्ट करें। – Kevin

+0

+1: 'long y = (long) x;' 'int (') ' –

6

RoundingMode.DOWN का उपयोग करें, यह शून्य की ओर जाता है।

उदाहरण:

BigDecimal value = new BigDecimal("1.4"); 
    value = value.setScale(0, RoundingMode.DOWN); 
    System.out.println(value.doubleValue()); 
    BigDecimal value1 = new BigDecimal("-1.4"); 
    value1 = value1.setScale(0, RoundingMode.DOWN); 
    System.out.println(value1.doubleValue()); 
+0

क्या 'बिगडिसीमल' उन सभी मानों का प्रतिनिधित्व कर सकता है जो 'फ्लोट' या 'डबल' का प्रतिनिधित्व कर सकते हैं? –

+0

बिगडेसिमल जावा में किसी संख्या का प्रतिनिधित्व करने का तरीका है, इसलिए BigDecimal – mprabhat

+0

@ ओली हां का उपयोग करना समझ में आता है। बिगडेसिमल एक मनमाना सटीक दशमलव है, यह सभी मूल्यों को एक फ्लोट और डबल कैन और अधिक का प्रतिनिधित्व कर सकता है। – Dunes

0

आप भी इस कोशिश कर सकते हैं:

public static void main(String[] args) { 
     Double myDouble = -3.2; 
     System.out.println(myDouble.intValue()); //Prints -3 

    } 
1
y=sign(x)*floor(abs(x)) 

या

y=sign(x)*round(abs(x)-0.5) 

यह जावा में लागू करने के लिए आसान होना चाहिए।

संबंधित मुद्दे