কোনটি ভাল, সংখ্যা (এক্স) বা পার্সফ্লোট (এক্স)?


146

কোনটা ভাল?

আমি এটি কেবল কয়েকটি বাইট শেভ করার খাতিরে জিজ্ঞাসা করছি, কারণ আমি সংখ্যার পরিবর্তে + এক্স ব্যবহার করতে পারি (এক্স)। পার্সফ্লোট কি আরও ভাল কিছু করে?


2
একক নির্ভুলতা ভাসমান পয়েন্ট সংখ্যা 32 বিট সিস্টেমে 4 বাইট পাশাপাশি প্লেইন ইন্টিজার দখল করে। আমি জানি না যে জাভাস্ক্রিপ্ট কীভাবে ভাসমান পরিচালনা করে তবে আমি অনুমান করি যে এটি প্রায় একই রকম।
খ্রিস্টান

5
@ ক্রিশ্চিয়ান: জাভাস্ক্রিপ্টের সমস্ত সংখ্যা ডাবল নির্ভুলতা ভাসমান।
গুফা

1
আমি যদি ইডিআইটি বিভাগের না হয়ে থাকি তবে এই প্রশ্নের জন্য আমি ইউপিকে ভোট দিয়েছি
লাপুয়ালোকা

উত্তর:


309

পার্সফ্লোট এবং সংখ্যার মধ্যে পার্থক্য

parseFloat/ parseIntএকটি স্ট্রিংকে পার্স করার জন্য, যখন Number/ +কোনও সংখ্যায় মান জোর দেওয়ার জন্য। তারা অন্যরকম আচরণ করে। তবে প্রথমে তারা কোথায় একই আচরণ করে তা দেখুন:

parseFloat('3'); // => 3
Number('3'); // => 3
parseFloat('1.501'); // => 1.501
Number('1.501'); // => 1.501
parseFloat('1e10'); // => 10000000000
Number('1e10'); // => 10000000000

সুতরাং যতক্ষণ না আপনার কাছে স্ট্যান্ডার্ড সংখ্যাসূচক ইনপুট রয়েছে ততক্ষণ কোনও পার্থক্য নেই। তবে, যদি আপনার ইনপুটটি কোনও সংখ্যার সাথে শুরু হয় এবং তারপরে অন্যান্য অক্ষর রয়েছে parseFloatতবে স্ট্রিংয়ের বাইরে নম্বরটি কেটে Numberদেয় NaN(কোনও সংখ্যা নয়):

parseFloat('1x'); // => 1
Number('1x'); // => NaN

এছাড়াও, Numberহেক্সাডেসিমাল ইনপুট বোঝে যখন parseFloatনা:

parseFloat('0x10'); // => 0
Number('0x10'); // => 16

তবে Numberখালি স্ট্রিং বা কেবল সাদা স্থানযুক্ত স্ট্রিংগুলির সাথে অদ্ভুত আচরণ করে:

parseFloat(''); // => NaN
Number(''); // => 0
parseFloat(' \r\n\t'); // => NaN
Number(' \r\n\t'); // => 0

সামগ্রিকভাবে, আমি Numberআরও যুক্তিসঙ্গত বলে মনে করি, তাই আমি প্রায় সর্বদা Numberব্যক্তিগতভাবে ব্যবহার করি (এবং আপনি দেখতে পাবেন যে অভ্যন্তরীণ জাভাস্ক্রিপ্টের অনেকগুলি কার্যকারিতাও ব্যবহার করে Number)। যদি কেউ টাইপ করে থাকে তবে '1x'আমি টাইপ করে এমন আচরণ করার চেয়ে কোনও ত্রুটি দেখাতে পছন্দ করি '1'। আমি যখন কেবল একটি স্টাইলকে একটি সংখ্যায় রূপান্তর করি তখনই কেবল আমি ব্যতিক্রম করি case parseFloatএই ক্ষেত্রে সহায়ক কারণ শৈলীগুলি এমন আকারে আসে '3px', যে ক্ষেত্রে আমি 'px'অংশটি ফেলে দিতে চাই এবং পেতে 3পারি, তাই আমি parseFloatসহায়ক খুঁজে পাই এখানে. তবে সত্যিই আপনি কোনটি বেছে নিন তা আপনার উপর নির্ভর করে এবং কোন ধরণের ইনপুট আপনি গ্রহণ করতে চান।

নোট করুন যে ইউনারি +অপারেটরটি ব্যবহার Numberকরা কোনও ফাংশন হিসাবে ব্যবহারের মতোই:

Number('0x10'); // => 16
+'0x10'; // => 16
Number('10x'); // => NaN
+'10x'; // => NaN
Number('40'); // => 40
+'40'; // => 40

সুতরাং আমি সাধারণত +সংক্ষিপ্ত জন্য ব্যবহার । যতক্ষণ আপনি জানেন এটি কী করে, আমি এটি পড়া সহজ মনে করি।


2
আমি "অদ্ভুত" হিসাবে হোয়াইটস্পেস => 0 আচরণ বিবেচনা করব না Number()আমি এটিকে আরও প্রত্যাশিত হিসাবেও বিবেচনা করব, সাদা স্থানটি একটি খালি মান তবে এটি নাল / অপরিজ্ঞাত নয় => 0 একটি দুর্দান্ত ফলাফল। যাইহোক যাইহোক
শোকেসগুলির

4
@NathanWall: উল্লেখ করতে চাইতে পারেন যে Number('Infinity') === InfinityযেহেতুparseInt('Infinity') === NaN
sstur

3
আমি +এটির জন্য (অ্যানারি প্লাস) ব্যবহার করব না , কারণ আপনি যদি আগের লাইনে একটি অর্ধিকোলন ভুলে যান তবে পরিবর্তে একটি সংযোজন প্রকাশের মূল্যায়ন করা যেতে পারে।
জ্যাকসন

1
ক্ষেত্রেগুলির ক্ষেত্রে তারা একই আচরণ করে আমি জানতে পেরেছি যে পার্সফ্লোট 1% থেকে 15% ধীর হয়ে ধীরে ধীরে ধীরে ধীরে দশমিক সংখ্যার সংখ্যা বৃদ্ধি পেলে ধীরে ধীরে হয়ে যায়। আমার সিস্টেমে 1 এম চালুর সাথে পার্সফ্লোট ('1.501') সংখ্যা ('1.501') এর চেয়ে 5% ধীর এবং পার্সফ্লোট ('1.50137585467') সংখ্যা ('1.50137585467') এর চেয়ে 15% ধীর। সুতরাং, আমি সংখ্যা () জন্য যান।
বাইটপেন

1
@ ChrisBrownie55 বাহ, ভাল ক্যাচ আমি জানতাম না পার্সফ্লোট এটি করতে পারে। আমার ধারণা অনন্ত কোনও পূর্ণসংখ্যা নয়!
স্টার

9

পার্থক্যটি তখন ঘটে যখন ইনপুটটি "সঠিক নম্বর" না হয়। "এটি যতটা পারে" পার্স করার সময় Numberপ্রত্যাবর্তন করে । যদি খালি স্ট্রিং আহ্বান আয় parseFloat ফেরৎ যখন ।NaNparseFloatNumber0NaN

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

Number("") === 0               // also holds for false
isNaN(parseFloat("")) === true // and null

isNaN(Number("32f")) === true
parseFloat("32f") === 32

4
NaN != NaNযদিও নোট করুন
ওয়েক্স

@Wex ওহ আপনি যে ment NaN != NaNমূল্যায়ণ 'সত্য' - ডগা জন্য ধন্যবাদ!
jave.web

4
ব্যবহার isNaN () NaN মান, পরীক্ষার জন্য isNaN(NaN)আয়true
jave.web

5

এই উদাহরণগুলিতে আপনি পার্থক্যটি দেখতে পাবেন:

Number('') = 0;
Number(false) = 0;
Number('1a') = NaN;

parseFloat('') = NaN;
parseFloat(false) = NaN;
parseFloat('1a') = 1;

পার্সফ্লোটটি কিছুটা ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে সংখ্যাযুক্ত মান বা ভ্যালু মান ধারণ করে এমন স্ট্রিং থেকে একটি নতুন সংখ্যা তৈরি করে while

পিএস যদি আপনি কিছু সার্বজনীন ধরণের রূপান্তর সমাধানে আগ্রহী হন তবে আপনি আমার ব্লগে টাইপ রূপান্তর সম্পর্কে পোস্টটি পড়তে পারেন: http://justsimplejs.blogspot.com/2012/08/data-type-conversion.html


2

খালি স্ট্রিংয়ের জন্য এগুলি আলাদা।

+""এবং Number("")0 প্রদান করে, যখন parseFloat("")NaN প্রদান করে।


2
আমি এতদূর যেতে হবে অর্থাৎ যেমন parseFloat()অধিকার ফলাফলের হয়েছে যেমন একটি খালি স্ট্রিং সংখ্যা নয় 0(পড়া: NAN) যখন অক্ষর দিয়ে একটি স্ট্রিং "0"IS তাতে 0;
ক্রিস্টোফার

+x0কেবল একটি খালি স্ট্রিংয়ের জন্য নয় কেবল কোনও সাদা স্থানের স্ট্রিংয়ের জন্যও ফেরত দেয় returns উদাহরণ: +" ", +"\t\t\t", +"\n\n"- তাদের সব দিতে 0ফলে
Lukasz Wiktor

2

আমি যতদূর জানি, এবং এটি কেবল সহকর্মীদের কাছ থেকে শোনা গেছে তাই পুরোপুরি অসুস্থ অবহিত হতে পারে, পার্সফ্লোট সামান্য দ্রুত।

যদিও আরও গবেষণা করার পরেও মনে হবে এই পারফরম্যান্স পার্থক্যটি ব্রাউজার নির্ভর।

http://jsperf.com/parseint-vs-parsefloat/6

এই jscreen ফলাফলগুলি দেখুন এবং আপনাকে কল করুন। (এতে + এক্স পরীক্ষাও রয়েছে)

@Xdazz যেমন লক্ষ করেছি এর উত্তর, +""এবং Number("")রিটার্ন 0যখন parseFloat("")আয় NaNতাই আবার আমি parseFloat সঙ্গে, যেতে হবে কারণ একটি খালি স্ট্রিং সংখ্যা 0 মানে এই নয়, শুধুমাত্র অক্ষর দিয়ে একটি স্ট্রিং "0"এটা 0 মানে হয়;


রূপান্তর করার আরও দ্রুত উপায়ের জন্য এখানে আরও বিস্তৃত পরীক্ষা ফিশিং ... parseFloat()এখনও বিজয়ী।
mindplay.dk
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.