Ingালাই ছাড়াই কীভাবে ডাবলকে লম্বা রূপান্তর করবেন?


191

Ingালাই ছাড়াই লম্বায় একটি ডাবলকে রূপান্তর করার সর্বোত্তম উপায় কী?

উদাহরণ স্বরূপ:

double d = 394.000;
long l = (new Double(d)).longValue();
System.out.println("double=" + d + ", long=" + l);

2
শুধু আপনার ডাবলস সঙ্গে কাজ করে না তা নিশ্চিত করতে চেয়ে বেশি 2 ^ 54 বা সংখ্যা মধ্যে মাপসই করা হবে না ভগ্নাংশ , তাই মত উদাহরণ এক্সপ্রেশন জন্য myLong == (long)(myDouble + 1)যেখানে myLongসমান myDoubleনির্ণয় করা হবেtrue
Vitalii Fedorenko

এই পদ্ধতিটি ( Double.longValue();) এখনও কার্যকর যদি আপনার মতো অ্যারেলিস্টের মতো জিনিসগুলির দ্বিগুণ মান থাকে তবে আপনি ArrayList<Double>একটি ত্রুটি কাস্ট করতে পারবেন না। আমি এখানে এসেছি এবং কিছুটা আলাদা সমস্যা আছে এমন যে কারও পক্ষে এটি বলছি।
সরোস

উত্তর:


250

ধরে নিই আপনি শূন্যের দিকে কাটাতে খুশি, সবেমাত্র কাস্ট করুন:

double d = 1234.56;
long x = (long) d; // x = 1234

এটি মোড়কের ক্লাসগুলির মধ্য দিয়ে যাওয়ার চেয়ে দ্রুত হবে - এবং আরও গুরুত্বপূর্ণ এটি আরও পাঠযোগ্য। এখন, আপনার যদি "সর্বদা শূন্যের দিকে" ব্যতীত অন্য রাউন্ডিংয়ের দরকার হয় তবে আপনার আরও জটিল কোডের প্রয়োজন হবে।


8
দুর্দান্ত উত্তর - আমার অ্যাপ্লিকেশনটির জন্য শূন্য অংশের দিকটি ভুল হত, সুতরাং আপনার উত্তরে এটি হাইলাইট করার জন্য প্রশংসা করুন এবং আমার ক্রেতার মস্তিষ্ককে কেবল castালাইয়ের পরিবর্তে ম্যাথ.গ্রাউন্ড () ব্যবহার করার জন্য মনে করিয়ে দিন!
ফ্যান্টমওহলে

123

... এবং এখানে গোলাকার উপায় যা কেটে যায় না। এটি জাভা এপিআই ম্যানুয়ালটিতে তাড়াহুড়ো করে:

double d = 1234.56;
long x = Math.round(d); //1235

এটি কাস্টের মতো একই ফলাফল দেয় না। সুতরাং এটি ধনী কী করতে চায় তার উপর নির্ভর করে।
সিরিল কা

3
হাঁ। এটি জোন যা বলেছিল তার সংযোজন হিসাবে ভাবা হয়েছিল :)
জোহানেস স্কাউব -

2
আমি এটি পছন্দ করি কারণ এটি আদিম ধরণের পরিবর্তে ডাবল এবং লং অবজেক্টের সাথেও কাজ করে।
themanatuf

58

পছন্দসই পদ্ধতির হওয়া উচিত:

Double.valueOf(d).longValue()

থেকে ডাবল (জাভা প্ল্যাটফর্ম দঃপূঃ 7) ডকুমেন্টেশন :

Double.valueOf(d)

Doubleনির্দিষ্ট doubleমানটিকে উপস্থাপন করে এমন একটি উদাহরণ দেয় । যদি কোনও নতুন Doubleউদাহরণের প্রয়োজন হয় না, তবে এই পদ্ধতিটি সাধারণত কনস্ট্রাক্টরের পছন্দ হিসাবে ব্যবহার করা উচিত Double(double), কারণ এই পদ্ধতিটি প্রায়শই অনুরোধ করা মানগুলি ক্যাশে করে উল্লেখযোগ্যভাবে আরও ভাল স্থান এবং সময়ের কার্যকারিতা অর্জন করে।


36

(new Double(d)).longValue() অভ্যন্তরীণভাবে কেবল একটি castালাই করে, সুতরাং ডাবল অবজেক্ট তৈরি করার কোনও কারণ নেই।


13

পেয়ারা ম্যাথ লাইব্রেরিতে একটি পদ্ধতি ডাবলকে দীর্ঘকে রূপান্তর করার জন্য বিশেষভাবে তৈরি করা হয়েছে:

long DoubleMath.roundToLong(double x, RoundingMode mode)

আপনি java.math.RoundingModeগোলাকার আচরণ নির্দিষ্ট করতে ব্যবহার করতে পারেন ।


7

যদি আপনার কাছে দৃ strong় সন্দেহ থাকে যে ডাবলটি আসলে একটি দীর্ঘ, এবং আপনি এটি করতে চান

1) দীর্ঘ হিসাবে এর সঠিক মানের একটি হ্যান্ডেল পান

2) কোনও ত্রুটি যখন এটি দীর্ঘ না হয় তখন নিক্ষেপ করুন

আপনি এই জাতীয় কিছু চেষ্টা করতে পারেন:

public class NumberUtils {

    /**
    * Convert a {@link Double} to a {@link Long}.
    * Method is for {@link Double}s that are actually {@link Long}s and we just
    * want to get a handle on it as one.
    */
    public static long getDoubleAsLong(double specifiedNumber) {
        Assert.isTrue(NumberUtils.isWhole(specifiedNumber));
        Assert.isTrue(specifiedNumber <= Long.MAX_VALUE && specifiedNumber >= Long.MIN_VALUE);
        // we already know its whole and in the Long range
        return Double.valueOf(specifiedNumber).longValue();
    }

    public static boolean isWhole(double specifiedNumber) {
        // http://stackoverflow.com/questions/15963895/how-to-check-if-a-double-value-has-no-decimal-part
        return (specifiedNumber % 1 == 0);
    }
}

লং হ'ল ডাবলের একটি উপসেট, তাই আপনি অজান্তে লং এর সীমার বাইরে থাকা একটি ডাবলকে রূপান্তর করার চেষ্টা করলে আপনি কিছু অদ্ভুত ফলাফল পেতে পারেন:

@Test
public void test() throws Exception {
    // Confirm that LONG is a subset of DOUBLE, so numbers outside of the range can be problematic
    Assert.isTrue(Long.MAX_VALUE < Double.MAX_VALUE);
    Assert.isTrue(Long.MIN_VALUE > -Double.MAX_VALUE); // Not Double.MIN_VALUE => read the Javadocs, Double.MIN_VALUE is the smallest POSITIVE double, not the bottom of the range of values that Double can possible be

    // Double.longValue() failure due to being out of range => results are the same even though I minus ten
    System.out.println("Double.valueOf(Double.MAX_VALUE).longValue(): " + Double.valueOf(Double.MAX_VALUE).longValue());
    System.out.println("Double.valueOf(Double.MAX_VALUE - 10).longValue(): " + Double.valueOf(Double.MAX_VALUE - 10).longValue());

    // casting failure due to being out of range => results are the same even though I minus ten
    System.out.println("(long) Double.valueOf(Double.MAX_VALUE): " + (long) Double.valueOf(Double.MAX_VALUE).doubleValue());
    System.out.println("(long) Double.valueOf(Double.MAX_VALUE - 10).longValue(): " + (long) Double.valueOf(Double.MAX_VALUE - 10).doubleValue());
}

Long is a subset of Doubleসঠিক নয়। লংয়ের জন্য উল্লেখযোগ্য অঙ্কগুলির সংখ্যা দ্বিগুণের চেয়ে বেশি, সুতরাং লম্বের হাতে থাকা কিছু তথ্য ডাবল রূপান্তরিত হয়ে যাওয়ার পরে হারিয়ে যেতে পারে। উদাহরণ = tio.run/…
থারিক নগ্রোহোটোমো

4

আপনি কি বাইনারি রূপান্তর মত চান?

double result = Double.longBitsToDouble(394.000d);

2
এটি যা জিজ্ঞাসা করা হচ্ছে তার বিপরীত।
লুকাস ফিলিপস

@ লুকাসফিলিপস আপনি ঠিক বলেছেন আমি অবশ্যই প্রশ্নটি ভুলভাবে পড়েছি, তবে আমি আমার উত্তরটি ছেড়ে দেব কারণ এটি অন্যকে সাহায্য করতে পারে।
pvorb

1

কেবল নিম্নলিখিত দ্বারা:

double d = 394.000;
long l = d * 1L;

0

সহজ কথায় বলতে গেলে, ডাবল অবজেক্ট তৈরির চেয়ে কাস্টিং আরও দক্ষ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.