কেন পার্সেন্ট (1/0, 19) 18 ফেরায়?


853

জাভাস্ক্রিপ্টে আমার বিরক্তিকর সমস্যা আছে ।

> parseInt(1 / 0, 19)
> 18

কেন parseIntফাংশন ফিরে আসে 18?


3
মজাদার. তবে কেন এটি আপনার জন্য বিরক্তিকর সমস্যা? আপনি কি অন্য উপায়ে অনন্ত পরিচালনা করতে হবে? যদি তা হয় তবে একটি ifসাহায্য করতে পারে।
থিলো

254
এমনকি আপনি কী করছেন যা আপনার বেস -১৯ নম্বর বা শূন্য দ্বারা বিভাগের সাথে কাজ করার প্রয়োজন ছিল !?
জ্যাক এম

19
আপনি যখন জেএস সম্পর্কে বিভ্রান্ত হন, কেবল এই উদ্ধৃতিটিতে ফিরে যান এবং মনে রাখবেন যে পুরো জঘন্য ভাষা 10 দিনেরও কম সময়ে ডিজাইন করা এবং প্রয়োগ করা হয়েছিল (যে ব্যক্তি এটি করেছে তার অনুসারে)।
টাইলার

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

2
অজগর একই কাজ করে: int ('আমি', 19) == 18
ওবেরহামসি

উত্তর:


1292

ফলাফল 1/0হয় Infinity

parseIntতার প্রথম যুক্তিকে স্ট্রিং হিসাবে বিবেচনা করে যার অর্থ প্রথমে Infinity.toString()বলা হয় স্ট্রিং উত্পাদন করে "Infinity"। সুতরাং এটি একইরূপে কাজ করে যদি আপনি এটিকে "Infinity"19 বেসকে দশমিক হিসাবে রূপান্তর করতে বলেছিলেন ।

দশমিক মানগুলির সাথে বেস 19 এ এখানে অঙ্কগুলি রয়েছে:

Base 19   Base 10 (decimal)
---------------------------
   0            0
   1            1
   2            2
   3            3
   4            4
   5            5
   6            6
   7            7
   8            8
   9            9
   a            10
   b            11
   c            12
   d            13
   e            14
   f            15
   g            16
   h            17
   i            18

এরপরে যা ঘটে তা হ'ল parseIntইনপুটটিকে স্ক্যান করে এর "Infinity"কোন অংশটি পার্স করা যায় এবং প্রথমটি গ্রহণ করার পরে থামিয়ে দেওয়া হয় I(কারণ n19 ভিত্তিতে কোনও বৈধ অঙ্ক নয়)।

সুতরাং এটি এমনভাবে আচরণ করে যেমন আপনি কল করেছেন parseInt("I", 19), যা উপরের টেবিলের মাধ্যমে দশমিক 18 এ রূপান্তরিত হয়েছে।


32
@ মিঠুনসথেশ চেষ্টা করুন parseInt('Infini',24)
সুপ্রিম

112
@ মিঠুনসথেশ: কারণ ২৪ বেসেও nএকটি বৈধ সংখ্যা, সুতরাং এটি আসলে শেষ হয় parseInt("Infini", 24)
জন

36
কেউ কেন এমন ভাষায় 'প্রোগ্রাম' করতে চায় যা এইরকম আচরণ করে তা আমার বাইরে।
ফ্রান্সস বোমা

45
@ ফ্রান্সসবাউমা: জেএস নিজের উপায়ে সুন্দর। এবং সত্যই, এখানে যা ঘটে থাকে তার কোনও অংশই গতিশীল ভাষায় অযৌক্তিক নয়।
জন

59
@ জন: এই নিদর্শনটি গতিশীল ভাষার ফলাফল নয়; এটি আলগা টাইপিংয়ের ফলাফল। কঠোরভাবে টাইপযুক্ত গতিশীল ভাষায়, এই ধরণের নির্বিকারতা রোধ করার জন্য, ইনফিনিটি (ফ্লোট) "ইনফিনিটি" (স্ট্রিং) এ অন্তর্নিহিত রূপান্তর ঘটবে না।
মিথ্যা রায়ান

225

এখানে ইভেন্টগুলির ক্রমটি রয়েছে:

  • 1/0 মূল্যায়ন Infinity
  • parseIntসার্চ Infinityএবং সুখে নোট যে Iবেস 19 18 হয়
  • parseInt স্ট্রিংয়ের অবশিষ্ট অংশগুলি উপেক্ষা করে, কারণ এটি রূপান্তর করা যায় না।

মনে রাখবেন যে আপনি কোনও বেসের জন্য ফলাফল পেতে চাইছেন >= 19তবে তার নীচের বেসগুলির জন্য নয়। বেসগুলির জন্য >= 24, আপনি একটি বৃহত্তর ফলাফল পাবেন, কারণ nসেই সময়ে এটি একটি বৈধ সংখ্যা হয়ে উঠবে।


@Thilo BTW, কি, কারন হতে পারে কেন এটা পারে 19 থামবে, যদি বেস এর বড়? আপনি কি জানেন, জেএস এর সর্বোত্তম বেসটি কী ব্যাখ্যা করতে পারে?
আর্থর

4
@ নর্ডভিন্ড বৃহত্তম বেসটি parseIntগ্রহণ করবে 36, যেহেতু ইংরেজি বর্ণমালায় 26 টি অক্ষর রয়েছে এবং কনভেনশনটি প্রদত্ত বেসটিতে বৈধ সংখ্যাগুলির সেট হিসাবে অক্ষরগুলি পরে অক্ষরগুলি ব্যবহার করে।
ক্রেগ সিট্রো

4
উপর বুলেট পয়েন্ট # 2, আমি পরিবর্তন সুপারিশ করতে পারি Infinityথেকে "Infinity"...
CJBS

38

উপরের উত্তর যুক্ত করতে:

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

var num = 1 / 0;
var numInBase19 = num.toString(19); // returns the string "Infinity"

13

উপরের উত্তর যুক্ত করতে

parseInt(1/0,19) সমতুল্য parseInt("Infinity",19)

বেস 19 সংখ্যার মধ্যে 0-9এবং A-I (or a-i)একটি বৈধ সংখ্যা। সুতরাং, "ইনফিনিটি" থেকে এটি Iবেস 19 গ্রহণ করে এবং বেস 10 এ রূপান্তরিত হয় যা 18 হয়ে যায় তারপরে এটি পরবর্তী অক্ষরটি গ্রহণ করার চেষ্টা করে nযা বেস 19 তে উপস্থিত নয় তাই পরবর্তী অক্ষরগুলি বাতিল করে দেয় (জাভাস্ক্রিপ্টের স্ট্রিংকে সংখ্যায় রূপান্তর করার আচরণ অনুসারে )

সুতরাং, যদি আপনি লিখতে parseInt("Infinity",19)বা parseInt("I",19)বা parseInt("i",19)ফল একই অর্থাত হতে হবে 18

এখন, আপনি লিখলে parseInt("I0",19)ফলাফলটি = = = 342 হিসাবে হবেI X 19 (the base)^1 + 0 X 19^018 X 19^1 + 0 X 19^018 X 19 + 0 X 1342

একইভাবে, parseInt("I11",19)ফলাফল হবে6518

অর্থাত

  18 X 19^2  +   1 X 19^1   +  1 X 19^0
= 18 X 19^2  +   1 X 19^1   +  1 X 19^0
= 18 X 361   +   1 X 19     +  1 X 1
= 6498  +  19  +  1
= 6518
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.