বিগডিসিমালকে পূর্ণসংখ্যায় রূপান্তর করা


134

আমার হাইবারনেট পদ্ধতি রয়েছে যা আমাকে বিগডিসিমাল হিসাবে ফিরিয়ে দেয়। আমার কাছে আরও একটি এপিআই পদ্ধতি রয়েছে যাতে আমাকে সেই নম্বরটি পাস করতে হবে তবে এটি পূর্ণসংখ্যাটিকে পরামিতি হিসাবে গ্রহণ করে। আমি রিটার্নের ধরণ বা উভয় পদ্ধতির পরিবর্তনশীল ধরণের পরিবর্তন করতে পারি না।

এখন কীভাবে বিগডিসিমালকে পূর্ণসংখ্যায় রূপান্তর করতে এবং দ্বিতীয় পদ্ধতিতে পাস করবেন?

এ থেকে বেরিয়ে যাওয়ার কোনও উপায় আছে কি?


6
আমি আপনার শিরোনাম সংশোধন করেছি। এটি রূপান্তর, castালাই নয়
লার্নের মার্কুইস

উত্তর:


209

আপনি কল করবেন myBigDecimal.intValueExact()(বা ন্যায়সঙ্গত intValue()) এবং এমনকি যদি আপনি তথ্য হারাবেন তবে এটি একটি ব্যতিক্রমও ছুঁড়ে দেবে। এটি কোনও পূর্বে ফিরে আসে তবে অটোবক্সিং সেটার যত্ন নেয় care


1
intValueExact()একটি ভাল সুপারিশ; এটি 1.5 এ যোগ হয়েছিল
আনন

কলিং intValue()বিপজ্জনক, যদি না আপনি 100% জীবনকে বাজি ধরে থাকেন তবে ইতিবাচক যে সংখ্যাটি Integerসীমার মধ্যে রয়েছে।
স্নেকস

1
এটি কি অর্থবহ করে: "Integer.valueOf (myBigDecimal.intValueExact ())"?
ওডডেভ

32

আপনি কি গ্যারান্টি দিতে পারবেন যে এর BigDecimalচেয়ে বড় কোনও মান কখনই থাকবে না Integer.MAX_VALUE?

যদি হ্যাঁ, তবে এখানে আপনার কোড কলিং রয়েছে intValue:

Integer.valueOf(bdValue.intValue())

হ্যাঁ. আমার ধারণা এটিতে পূর্ণসংখ্যার চেয়ে বড় মান থাকবে না MA MAX_VALUE
বিশাল

2
কোনও আদিম অধিকারের পরিবর্তে কোনও অবজেক্ট পাওয়া ছাড়া অন্য মানটি করার কোনও কারণ নেই?
তুলসী

আমি বলব এটির সরকারী উত্তর হওয়া উচিত কারণ এ। সীমা উল্লেখ, খ। অটোবক্সিং প্রতিরোধ করে।
নেতৃত্বলজিক

22

টি এল; ডিআর

সর্বজনীন রূপান্তর প্রয়োজনের জন্য এর মধ্যে একটি ব্যবহার করুন

//Java 7 or below
bigDecimal.setScale(0, RoundingMode.DOWN).intValueExact()
//Java 8    
bigDecimal.toBigInteger().intValueExact()

যুক্তি

প্রয়োজনীয়তাগুলি কী এবং আপনি এই প্রশ্নের উত্তর কীভাবে দেয় তার উপর উত্তর নির্ভর করে।

  • হবে BigDecimalসম্ভাব্য একটি নন-জিরো ভগ্ন অংশ আছে?
  • হবে BigDecimalসম্ভাব্য ধরছে না Integerপরিসর?
  • আপনি কি শূন্য-বিভাজনযুক্ত অংশগুলি বৃত্তাকার বা কাটা কাটাতে চান?
  • আপনি কীভাবে শূন্য-বিভাজক অংশগুলি বৃত্তাকার চান?

যদি আপনি প্রথম 2 টি প্রশ্নের উত্তর না দিয়ে থাকেন তবে BigDecimal.intValueExact()অন্যরা যেভাবে পরামর্শ দিয়েছিলেন ঠিক তেমনই আপনি ব্যবহার করতে পারেন এবং যখন অপ্রত্যাশিত কিছু ঘটে তখন তা ফুটিয়ে উঠতে দেয়।

আপনি একেবারে 100% প্রশ্ন সংখ্যা 2 সম্পর্কে আত্মবিশ্বাসী না হন, তাহলে, তারপর intValue()হয় সবসময় ভুল উত্তর।

এটি আরও ভাল করা

অন্যান্য উত্তরের উপর ভিত্তি করে নিম্নলিখিত অনুমানগুলি ব্যবহার করি use

  • যথার্থতা হারাতে এবং মান কেটে ফেলার সাথে আমরা ঠিক আছি কারণ এটাই intValueExact()এবং অটো-বক্সিং করে
  • রেঞ্জের BigDecimalচেয়ে বড় হয়ে গেলে আমরা একটি ব্যতিক্রম ছুঁড়ে ফেলাতে চাই Integerকারণ যখন আপনি হাই-অর্ডার বিটগুলি ফেলে রাখেন তখন আপনার চারপাশের মোড়কের খুব নির্দিষ্ট প্রয়োজন না থাকলে অন্য কোনও কিছু পাগল হয়ে যায়।

এই প্যারামগুলি দেওয়া, intValueExact()একটি ব্যতিক্রম ছুঁড়ে ফেলা হয় যখন আমরা এটি না চাই যদি আমাদের ভগ্নাংশের অংশটি শূন্য হয় না। অন্যদিকে, intValue()আমাদের BigDecimalখুব বড় যদি এটি করা উচিত তখনও একটি ব্যতিক্রম ছুঁড়ে না ।

উভয় বিশ্বের সেরা পেতে, BigDecimalপ্রথমে গোল করুন , তারপরে রূপান্তর করুন। রাউন্ডিং প্রক্রিয়াটিতে আপনাকে আরও নিয়ন্ত্রণ দেওয়ার সুবিধাও রয়েছে।

গ্রোক অভ্যাস পরীক্ষা করুন

void 'test BigDecimal rounding'() {
    given:
    BigDecimal decimal = new BigDecimal(Integer.MAX_VALUE - 1.99)
    BigDecimal hugeDecimal = new BigDecimal(Integer.MAX_VALUE + 1.99)
    BigDecimal reallyHuge = new BigDecimal("10000000000000000000000000000000000000000000000")
    String decimalAsBigIntString = decimal.toBigInteger().toString()
    String hugeDecimalAsBigIntString = hugeDecimal.toBigInteger().toString()
    String reallyHugeAsBigIntString = reallyHuge.toBigInteger().toString()

    expect: 'decimals that can be truncated within Integer range to do so without exception'
    //GOOD: Truncates without exception
    '' + decimal.intValue() == decimalAsBigIntString
    //BAD: Throws ArithmeticException 'Non-zero decimal digits' because we lose information
    // decimal.intValueExact() == decimalAsBigIntString
    //GOOD: Truncates without exception
    '' + decimal.setScale(0, RoundingMode.DOWN).intValueExact() == decimalAsBigIntString

    and: 'truncated decimal that cannot be truncated within Integer range throw conversionOverflow exception'
    //BAD: hugeDecimal.intValue() is -2147483648 instead of 2147483648
    //'' + hugeDecimal.intValue() == hugeDecimalAsBigIntString
    //BAD: Throws ArithmeticException 'Non-zero decimal digits' because we lose information
    //'' + hugeDecimal.intValueExact() == hugeDecimalAsBigIntString
    //GOOD: Throws conversionOverflow ArithmeticException because to large
    //'' + hugeDecimal.setScale(0, RoundingMode.DOWN).intValueExact() == hugeDecimalAsBigIntString

    and: 'truncated decimal that cannot be truncated within Integer range throw conversionOverflow exception'
    //BAD: hugeDecimal.intValue() is 0
    //'' + reallyHuge.intValue() == reallyHugeAsBigIntString
    //GOOD: Throws conversionOverflow ArithmeticException because to large
    //'' + reallyHuge.intValueExact() == reallyHugeAsBigIntString
    //GOOD: Throws conversionOverflow ArithmeticException because to large
    //'' + reallyHuge.setScale(0, RoundingMode.DOWN).intValueExact() == reallyHugeAsBigIntString

    and: 'if using Java 8, BigInteger has intValueExact() just like BigDecimal'
    //decimal.toBigInteger().intValueExact() == decimal.setScale(0, RoundingMode.DOWN).intValueExact()
}

18

ঠিক আছে, আপনি কল করতে পারেন BigDecimal.intValue():

এই বিগডিসিমালকে ইনটিতে রূপান্তর করে। এই রূপান্তরটি জাভা ভাষার নির্দিষ্টকরণে সংজ্ঞায়িত হিসাবে ডাবল থেকে সংক্ষেপে সংকীর্ণ আদিম রূপান্তরটির সাথে সাদৃশ্য: এই বিগডিসিমালের যে কোনও ভগ্নাংশই বাতিল করা হবে, এবং যদি ফলস্বরূপ "বিগইন্টিজার" খুব বড় হয় তবে কোনও আন্তঃনিঃ -অর্ডার 32 বিট ফিরে আসে নোট করুন যে এই রূপান্তরটি এই বিগডিসিমাল মানটির সামগ্রিক পরিমাণ এবং সূক্ষ্মতা সম্পর্কে তথ্য হারাতে পারে এবং বিপরীত চিহ্ন সহ একটি ফলাফলও ফিরে আসতে পারে।

তারপরে আপনি জাভাটির Integer.valueOf(int)যথেষ্ট সাম্প্রতিক সংস্করণ ব্যবহার করছেন তবে আপনি স্পষ্টভাবে কল করতে বা অটোর-বক্সিংটি এটি করার জন্য করতে পারেন।





-4

আমি দেখতে পেয়েছি যে উপরেরটি আমার পক্ষে কাজ করে না। আমি একটি জেটিবেল থেকে একটি সেল মান টেনে নিচ্ছিলাম তবে ডাবল বা ইন্টি ইত্যাদি করতে পারি না আমার সমাধান:

Object obj = getTable().getValueAt(row, 0);

যেখানে সারি 0 সর্বদা একটি সংখ্যা হবে। আশা করি এটি এখনও যে কেউ স্ক্রোল করতে সহায়তা করে!

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