কেন এটি পার্সিয়ান্ট (8,3) == ন্যান এবং পার্সিয়ান্ট (16,3) == 1?


191

আমি পড়া করছি এই কিন্তু আমি কি লেখা আছে দ্বারা বিভ্রান্ত করছি একটি র্যাডিক্স আর্গুমেন্ট সহ parseInt অধ্যায়

পার্সেন্টের সারণী (_, 3) ফলাফল

কেন এটি parseInt(8, 3)NaNএবং parseInt(16, 3)1?

আফাইক 8 এবং 16 বেস -3 নম্বর নয়, সুতরাং খুব parseInt(16, 3)ফিরে আসা উচিতNaN

প্রথম দশটি বেস -3 প্রাকৃতিক সংখ্যা


4
তবুও আরেকটি সমস্যা যা স্থির টাইপিং দ্বারা সমাধান করা হত (বা কমপক্ষে সুস্পষ্টভাবে পূর্ণসংখ্যাকে স্ট্রিংগুলিতে রূপান্তরিত করে না): পি
নবীন ২

4
@ নাভিন এর স্থির বনাম গতিশীল টাইপিংয়ের সাথে কিছুই করার নেই (যেমন আপনি নিজেরাই নোট করেন)। শক্তিশালী টাইপের বিপরীতে সমস্যা এখানে দুর্বল।
সোভেন মারনাচ ২

12
আমি যখন এই প্রশ্নের শিরোনামটি দেখলাম তখন আমি নিজেকে ভেবেছিলাম, "এটি সম্ভবত লোজাবাস্ক্রিপ্টের কারণে"। উত্তরগুলি দেখে আমি আমার প্রবৃত্তিটি মূলত সঠিক ছিল বলে বিচার করি।
বেন মিলউড

উত্তর:


373

লোকেদের সম্পর্কে এটি জানার পরেও লোকে এটি সর্বদা ভ্রমণ করে। :-) আপনি একই কারণে এটি দেখছেন parseInt("1abc")1: parseIntপ্রথম অবৈধ চরিত্রটি থামবে এবং সেই সময়ে যা আছে তা ফিরিয়ে দেবে। যদি বিশ্লেষণ করতে কোনো বৈধ অক্ষর, এটা ফেরৎ NaN

parseInt(8, 3)"" "8"বেস 3 পার্স "এর অর্থ (নোটটি সংখ্যাকে 8একটি স্ট্রিতে রূপান্তরিত করে ; বিশদ বিবরণে ) কিন্তু বেস 3, একক অঙ্ক সংখ্যা মাত্র হয় 0, 1এবং 2। এটি "9"অষ্টালে পার্স করতে বলার মতো । যেহেতু কোনও বৈধ অক্ষর ছিল না , তাই আপনি পেয়েছেন NaN

parseInt(16, 3)এটি "16"বেস 3 এ পার্স করতে বলছে কারণ যেহেতু এটি পার্স করতে পারে 1, এটি করে এবং তারপরে এটি থামায় 6কারণ এটি পার্স করতে পারে না। সুতরাং এটি ফিরে আসে 1


যেহেতু এই প্রশ্নটি খুব বেশি মনোযোগ পাচ্ছে এবং অনুসন্ধান ফলাফলগুলিতে উচ্চতর স্থান পেতে পারে, তাই জাভা স্ক্রিপ্টে স্ট্রিংগুলিকে সংখ্যায় রূপান্তর করার জন্য তাদের বিভিন্ন আইডিয়াসিন্যাস এবং অ্যাপ্লিকেশন (এসও-তে আমার অন্য উত্তর থেকে তুলে নেওয়া হয়েছে) এর বিকল্পগুলির একটি গতিবিধি এখানে রয়েছে:

  • parseInt(str[, radix])- শেষে অতিরিক্ত অক্ষর উপেক্ষা করে স্ট্রিংটির শুরুতে যতটা পূর্ণ (পূর্ণসংখ্যা) সংখ্যায় রূপান্তর করতে পারে তেমন রূপান্তর করে। তাই parseInt("10x")হয় 10; xউপেক্ষা করা হয়। , একটি ঐচ্ছিক র্যাডিক্স (নম্বর বেস) যুক্তি সমর্থন করে, যাতে parseInt("15", 16)হয় 21( 15হেক্স মধ্যে)। যদি কোনও রেডিক্স না থাকে তবে দশমিকটি ধরে নেওয়া হয় যদি না স্ট্রিংটি 0x(বা 0X) দিয়ে শুরু হয় তবে এই ক্ষেত্রে এটি সেগুলি এড়িয়ে যায় এবং হেক্স অনুমান করে। (কিছু ব্রাউজার দিয়ে শুরু আচরণ স্ট্রিং ব্যবহার করা 0অকট্যাল হিসেবে; যে আচরণ নিদিষ্ট কখনো হয়েছিলেন বিশেষভাবে অননুমোদিত ES5 নির্দেশের মধ্যে।) রিটার্নস NaNকোন parseable ডিজিটের পাওয়া যায়।

  • parseFloat(str)- পছন্দ করুন parseIntতবে ভাসমান-পয়েন্ট সংখ্যাগুলি করে এবং কেবলমাত্র দশমিক সমর্থন করে। আবার স্ট্রিং উপর অতিরিক্ত অক্ষর উপেক্ষা করা হয়, তাই parseFloat("10.5x")হল 10.5( xউপেক্ষা করা হয়)। শুধুমাত্র দশমিক হিসেবে সমর্থিত, parseFloat("0x15")হয় 0(এ সমাপ্ত পার্স কারণ x)। রিটার্নস NaNকোন parseable ডিজিটের পাওয়া যায়।

  • আনরি +, উদাহরণস্বরূপ +str- (উদাহরণস্বরূপ, অন্তর্নিহিত রূপান্তর) ভাসমান পয়েন্ট এবং জাভাস্ক্রিপ্টের স্ট্যান্ডার্ড নম্বর স্বরলিপি ব্যবহার করে পুরো স্ট্রিংকে একটি সংখ্যায় রূপান্তরিত করে (কেবলমাত্র অঙ্ক এবং একটি দশমিক পয়েন্ট = দশমিক; 0xপ্রিফিক্স = হেক্স; 0oউপসর্গ = অক্টাল [ইএস ২০১৫ +]; কিছু বাস্তবায়ন এটিকে প্রসারিত করে নেতৃস্থানীয়কে 0অক্টাল হিসাবে আচরণ করার জন্য , তবে কড়া মোডে নয়)। +"10x"হয় NaNকারণ xহয় না উপেক্ষা করেছেন। +"10"হয় 10, +"10.5"হয় 10.5, +"0x15"হয় 21, +"0o10"হয় 8[ES2015 + +]। একটি gotcha হয় আছে: +""হয় 0না NaNহিসাবে আপনি আশা করতে পারেন।

  • Number(str)- হুবহু অন্তর্নিহিত রূপান্তরটির মতো (উদাহরণস্বরূপ, +উপরের একেরীর মতো ) তবে কিছু বাস্তবায়নে ধীর। (এটি সম্ভবত ব্যাপার হওয়ার সম্ভাবনা নয়))


8
তাহলে parseIntপ্রথম toStringযুক্তিতে প্রথম ব্যবহার হয়? এটা বোঝা যাবে।
বিবর্তনবক্স

16
@ ইভোলিউশনবক্স: হ্যাঁ, এটি parseIntঅ্যালগরিদমের প্রথম পদক্ষেপ : ইকমা
টিজে ক্রাউডার

5
আমি অনুমান 123e-2দেয় 1যেহেতু এটি মধ্যে সক্রিয় 1.23প্রথম, এবং তারপর দশমিক সময়ে স্টপ পার্স?
ilkkachu

6
"এটি লোকেরা সর্বদা ঘুরে বেড়ায়, এমনকি তারা যখন এ সম্পর্কে জানে তখনও" -> আমি কি কেবলই মনে করি যে এটি একটি বাগ হওয়া উচিত? উদাহরণস্বরূপ জাভাতে একই কাজ আপনাকে NumberFormatExceptionপ্রতিটি সময় দেবে।
উইম দেবলাউউ

4
@ স্পেনমার্নাচ: এই অংশটির parseInt(স্ট্রিংয়ে প্রথম যুক্তি জোর করে ) বোঝা যায়। এর উদ্দেশ্য parseIntহ'ল একটি স্ট্রিং পুরো সংখ্যায় পার্স করা। সুতরাং আপনি যদি এটি এমন কিছু দেন যা একটি স্ট্রিং নয় তবে এর স্ট্রিংয়ের উপস্থাপনাটি দিয়ে তা বোঝা যায়। এটির পরে এটি কী করে তা পুরো 'নটর গল্প'
টিজে ক্রোডার

54

একই কারণে যে

>> parseInt('1foobar',3)
<- 1

ইন ডক , parseIntএকটি স্ট্রিং লাগে। এবং

স্ট্রিং যদি স্ট্রিং না হয় তবে তা স্ট্রিংয়ে রূপান্তরিত হয়

সুতরাং 16, 8বা '1foobar'প্রথম স্ট্রিংয়ে রূপান্তরিত হয়।

তারপর

যদি parseIntএকটি চরিত্র যে নির্দিষ্ট র্যাডিক্স একটি সংখ্যা নয় এনকাউন্টার, এটা এবং সব সফল অক্ষর উপেক্ষা করে

অর্থ এটি যেখানে পারে সেখানে রূপান্তরিত করে। 6, 8, এবং foobarউপেক্ষা করা হয়, এবং শুধুমাত্র কি সামনে রূপান্তরিত হয়। কিছু না থাকলে, NaNফেরত দেওয়া হয়।


0
/***** Radix 3: Allowed numbers are [0,1,2] ********/
parseInt(4, 3); // NaN - We can't represent 4 using radix 3 [allowed - 0,1,2]

parseInt(3, 3); // NaN - We can't represent 3 using radix 3 [allowed - 0,1,2]

parseInt(2, 3); // 2   - yes we can !

parseInt(8, 3); // NaN - We can't represent 8 using radix 3 [allowed - 0,1,2]

parseInt(16, 3); // 1  
//'16' => '1' (6 ignored because it not in [0,1,2])    

/***** Radix 16: Allowed numbers/characters are [0-9,A-F] *****/ 
parseInt('FOX9', 16); // 15  
//'FOX9' => 'F' => 15 (decimal value of 'F')
// all characters from 'O' to end will be ignored once it encounters the out of range'O'
// 'O' it is NOT in [0-9,A-F]

আরও কয়েকটি উদাহরণ:

parseInt('45', 13); // 57
// both 4 and 5 are allowed in Radix is 13 [0-9,A-C]

parseInt('1011', 2); // 11 (decimal NOT binary)

parseInt(7,8); // 7
// '7' => 7 in radix 8 [0 - 7]

parseInt(786,8); // 7 
// '78' => '7' => 7 (8 & next any numbers are ignored bcos 8 is NOT in [0-7])

parseInt(76,8); // 62 
// Both 7 & 6 are allowed '76' base 8 decimal conversion is 62 base 10 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.