বিগডিসিমাল - নতুন বা মানযুক্ত ব্যবহার করতে


101

আমি বিগডিসিমাল অবজেক্টটিকে একটি ডাবল ডি থেকে বের করার দুটি উপায় পেয়েছি।

1. new BigDecimal(d)
2. BigDecimal.valueOf(d)

কোন ভাল পদ্ধতির হতে হবে? একটি নতুন অবজেক্ট তৈরি মান?

সাধারণভাবে (কেবলমাত্র বিগডিসিমাল নয়) কী সুপারিশ করা হয় - নতুন বা মানফল?

ধন্যবাদ


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

উত্তর:


165

এগুলি দুটি পৃথক প্রশ্ন: "আমি কীসের জন্য ব্যবহার করব BigDecimal?" এবং "আমি সাধারণভাবে কী করব?"

কারণ BigDecimal: এটি কিছুটা জটিল, কারণ তারা একই কাজ করে নাBigDecimal.valueOf(double)ব্যবহার করবে ক্যানোনিকাল Stringউপস্থাপনা এর doubleinstantiate জন্য পাস করতে মান BigDecimalবস্তু। অন্য কথায়: BigDecimalঅবজেক্টের মান হ'ল আপনি যখন দেখবেন তখন তা হবে System.out.println(d)

তবে আপনি যদি ব্যবহার করেন new BigDecimal(d)তবে যথাসম্ভব যথাযথভাবে মানটি BigDecimalউপস্থাপন করার চেষ্টা করবে । এটি সাধারণত আপনার ইচ্ছার চেয়ে অনেক বেশি সংখ্যায় সঞ্চিত হয়ে থাকে। কড়া কথায় বলতে গেলে এটি এর চেয়ে বেশি সঠিক , তবে এটি অনেকটা স্বজ্ঞাত।doublevalueOf()

জাভাডকের একটি সুন্দর ব্যাখ্যা রয়েছে:

এই নির্মাণকারীর ফলাফল কিছুটা অনাকাঙ্ক্ষিত হতে পারে। কেউ ধরে নিতে পারেন যে new BigDecimal(0.1)জাভাতে লিখন এমন একটি তৈরি করে BigDecimalযা 0.1 এর সমান (1 এর একটি অপ্রচলিত মান, 1 এর স্কেল সহ), তবে এটি আসলে 0.1000000000000000055511151231257827021181583404541015625 এর সমান। এটি হ'ল ০.১ কে হুবহু হিসাবে উপস্থাপন করা যায় না double(বা, এই বিষয়ে কোনও সীমাবদ্ধ দৈর্ঘ্যের বাইনারি ভগ্নাংশ হিসাবে)। সুতরাং, নির্মাণকারীর কাছে যে মানটি প্রেরণ করা হচ্ছে তা 0.1 এর সমান নয়, উপস্থিতি সত্ত্বেও।

সাধারণভাবে, যদি ফলাফলটি একই হয় (যেমন BigDecimal, তবে বেশিরভাগ ক্ষেত্রে না হয়) তবে valueOf()তার আগে অগ্রাধিকার দেওয়া উচিত: এটি সাধারণ মানের ক্যাচিং করতে পারে (যেমন দেখা যাচ্ছে Integer.valueOf()) এবং এটি এমনকি ক্যাচিং আচরণটি পরিবর্তন করতে পারে কলার পরিবর্তন করতে হবে। প্রয়োজনীয় না হলেও সর্বদা একটি নতুন মান ইনস্ট্যান্ট newকরবে (সেরা উদাহরণ: বনাম )।new Boolean(true)Boolean.valueOf(true)


এটি আমার প্রশ্নেরও ব্যাখ্যা দেয়: স্ট্যাকওভারফ্লো.com
খ্রিস্টান

4
@ জোছিম, এটি পরিষ্কার ছিল না। এর new BigDecimal()চেয়ে ভাল BigDecimal.valueOf()?
ryantage

5
@ রিওয়ান্টেজ: যদি একজনের তুলনায় অন্যটির চেয়ে কঠোরভাবে উন্নতি হয় তবে উভয়ের প্রয়োজন হবে না এবং আমার উত্তরটি আরও সংক্ষিপ্ত হবে। তারা একই জিনিস করে না, সুতরাং আপনি তাদেরকে এ জাতীয়ভাবে স্থান দিতে পারবেন না।
জোছিম সউর

4
@ জোয়াচিমসৌয়ার, ঠিক আছে দুঃখিত আমার আরও নির্দিষ্ট হওয়া উচিত ছিল। আপনি কখন new BigDecimal()পছন্দ হবে এবং তার উদাহরণ কখন পছন্দ হবে তার উদাহরণ দেওয়ার বিষয়ে আপনি কি আপত্তি করবেন BigDecimal.valueOf()?
ryvanage

@ryvantage: ফলাফল তুলনা new BigDecimal(1.0/30.0);এবং BigDecimal.valueOf(1.0/30.0)। কোন ফলাফলটি সংখ্যাগত ভগ্নাংশের 1/30 এর নিকটে আসলে দেখুন।
সুপারক্যাট

48

আপনি যদি BigDecimalমুদ্রার মানগুলি সংরক্ষণ করতে আপনার অবজেক্টগুলি ব্যবহার করেন তবে আমি দৃ strongly়ভাবে সুপারিশ করছি যে আপনি তাদের গণনায় কোনও দ্বিগুণ মান জড়িত করবেন না

অন্য উত্তরে যেমন বলা হয়েছে, ডাবল মান সহ জ্ঞাত নির্ভুলতার সমস্যা রয়েছে এবং এগুলি আপনাকে ফিরে আসার জন্য বড় সময় আসবে।

আপনি এটি অতীত হয়ে গেলে, আপনার প্রশ্নের উত্তরটি সহজ। স্ট্রিং মান সহ কনস্ট্রাক্টর পদ্ধতিটি সর্বদা কনস্ট্রাক্টরের আর্গুমেন্ট হিসাবে ব্যবহার করুন, কারণ এর জন্য কোনও valueOfপদ্ধতি নেই String

আপনি যদি প্রমাণ চান, নিম্নলিখিত চেষ্টা করুন:

BigDecimal bd1 = new BigDecimal(0.01);
BigDecimal bd2 = new BigDecimal("0.01");
System.out.println("bd1 = " + bd1);
System.out.println("bd2 = " + bd2);

আপনি নিম্নলিখিত আউটপুট পাবেন:

bd1 = 0.01000000000000000020816681711721685132943093776702880859375
bd2 = 0.01

এই সম্পর্কিত প্রশ্নটি দেখুন


5

মূলত valueOf (ডাবল ভাল) কেবল এটি করে:

return new BigDecimal(Double.toString(val));

সুতরাং -> হ্যাঁ, একটি নতুন অবজেক্ট তৈরি করা হবে :)।

সাধারণভাবে আমি মনে করি এটি আপনার কোডিং শৈলীর উপর নির্ভর করে। আমি মান ওফ এবং "নতুন" মিশ্রণ করব না, যদি উভয়ই একই ফলাফল হয়।


7
প্রযুক্তিগতভাবে সত্য, তবে : এটি একটি বিশাল পার্থক্য আনবে। valueOf()আরও স্বজ্ঞাত আচরণ করা হয়েছে, এবং new BigDecimal(d)আরও সঠিক আচরণ রয়েছে । উভয় চেষ্টা করুন এবং পার্থক্য দেখুন।
জোচিম সৌর

প্রযুক্তিগতভাবে মিথ্যা। 'নতুন' সর্বদা কীওয়ার্ড সর্বদা একটি নতুন অবজেক্ট তৈরি করে যখন জাভাদোকটি জানায় না যে মান ওফ সর্বদা একটি নতুন অবজেক্ট ফিরে আসবে কি না। এটা না, সবসময় না। ক্যাশে এটির কিছু মান রয়েছে new BigDecimal(1) != new BigDecimal(1)তবেBigDecimal.valueOf(1) == BigDecimal.valueOf(1)
অলকু

4
@user: হ্যাঁ, কিন্তু যেহেতু BigDecimalঅপরিবর্তনীয় এটা একই ভাবে আদিম চাদরে (চিকিত্সা করা উচিত Integer, Byte, ...) এবং Stringবস্তুর পরিচয়: চিকিত্সা করা হয় ব্যাপার করা উচিত নয় আপনার কোডে, শুধুমাত্র মান ব্যাপার করা উচিত নয়।
জোছিম সউর

@ জোয়াচিম ডান তবে অভ্যন্তরীণ ক্যাশেটি কোনও কারণে রয়েছে। বিগডিসিমালের অনেকগুলি প্রয়োজনের সমান দৃষ্টান্ত থাকা ভাল জিনিস নয়। এবং আমি
ডকে জবাব দিচ্ছিলাম

4
@ ব্যবহারকারী: হ্যাঁ, তাই আমি বলেছিলাম যে valueOf()এটি সাধারণত পছন্দ করা উচিত । তবে নোট করুন যে BigDecimal.valueOf(double)কোনও ক্যাচিং করে না (এবং এটি সম্ভবত এটির পক্ষে উপযুক্ত হবে না)।
জোছিম সউর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.