আমি কীভাবে জাভাস্ক্রিপ্টে কোনও সংখ্যাকে গোল করতে পারি? .toFixed () একটি স্ট্রিং ফেরত দেয়?


176

আমি কি এখানে কিছু মিস করছি?

var someNumber = 123.456;
someNumber = someNumber.toFixed(2);
alert(typeof(someNumber));
//alerts string

কেন.toFixed() একটি স্ট্রিং ফিরেআসে?

আমি সংখ্যাটি 2 দশমিক সংখ্যায় গোল করতে চাই।


7
কারণ এটি একটি স্ট্রিং ফেরত ডিজাইন করা হয়েছে?
কেনেটিএম

2
আমার কাছে এটি কেবল অদ্ভুত বলে মনে হচ্ছে। .toFixed () কেবলমাত্র সংখ্যায় পরিচালিত হয় ... তাই না?
ডেরেক আদায়ার

10
আমি বুঝেছি ম্যাথ.াউন্ড () আশা হিসাবে কাজ করে। আমি কেবল জিজ্ঞাসা করছিলাম যে সংখ্যার উপর পরিচালিত একটি ফাংশন কেন স্ট্রিং ফিরে আসে ...
ডেরেক অ্যাডায়ার

3
2017 সালে বসবাসকারী লোকদের লডাব্যাশস
ইয়ভেস এম

1
তাই _। গণনা? এখনও তার ব্রোতে আপগ্রেড হয়নি।
জেনা লিফ

উত্তর:


124

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

উদাহরণস্বরূপ, 0.1 হ'ল 0.1000000000000000055511151231257827021181583404541015625, এবং 0.01 আসলে 0.01000000000000000020816681711721685132943093776702880859375। ( BigDecimalআমার বক্তব্য প্রমাণ করার জন্য ধন্যবাদ । :- পি)

অতএব (দশমিক ভাসমান বিন্দু বা যৌক্তিক সংখ্যা প্রকারের অনুপস্থিত), স্ট্রিং হিসাবে আউটপুট দেওয়া হ'ল এটি প্রদর্শনের জন্য প্রয়োজনীয় নির্ভুলতার সাথে ছাঁটাই করার একমাত্র উপায়।


28
কমপক্ষে জাভাস্ক্রিপ্ট আমাকে কিছু আঙুলের কাজ বাঁচাতে এবং এটিকে আবার একটি সংখ্যায় রূপান্তর করতে পারে ... শেরে ...
ডেরেক অ্যাডায়ার

10
@ ডেরেক: হ্যাঁ, তবে একবার আপনি এটিকে আবার কোনও সংখ্যায় রূপান্তরিত করলে আপনি আবার একই অসাধ্যতার সমস্যাগুলিতে চলে যান। :- পি জেএসের দশমিক ভাসমান পয়েন্ট বা যৌক্তিক সংখ্যা নেই।
ক্রিস জেস্টার-ইয়ং

1
@ ডেরেকএডায়ার আমি সম্প্রতি একটি পোস্ট লিখেছি যা এটি আরও আরও ব্যাখ্যা করে, যাতে আপনার আগ্রহী হতে পারে En উপভোগ করুন! stackoverflow.com/a/27030789/13
ক্রিস জেস্টার-ইয়ং

7
আসলে এটি আমাকে এই বিষয় সম্পর্কে বেশ ভারী গবেষণা করতে বাধ্য করেছিল! সব আপনার সাহায্যের জন্য ধন্যবাদ!
ডেরেক অ্যাডায়ার

2
আপনার উত্তরটি সামান্য বিভ্রান্তিকর: toFixedএকটি বিন্যাসকরণ ফাংশন, যার একটি নির্দিষ্ট সংখ্যাকে দশমিকের সংখ্যার সাহায্যে বিন্যাসকরণকে স্ট্রিংয়ে রূপান্তর করার একমাত্র উদ্দেশ্য রয়েছে। এটি একটি স্ট্রিং ফেরত দেওয়ার কারণ হ'ল এটি একটি স্ট্রিং ফেরত দেওয়ার কথা, এবং যদি এর toStringFixedপরিবর্তে নামকরণ করা হয়, ফলাফলগুলি দেখে ওপি অবাক হবে না। এখানে একমাত্র বিষয়টি হ'ল ওএস Math.roundজেএস রেফারেন্সের সাথে পরামর্শ না করেই এটির মতো কাজ করবে বলে আশা করেছিল ।
গ্রো

177

Number.prototype.toFixedএটি মুদ্রণের আগে একটি সংখ্যা বিন্যাস করার জন্য ডিজাইন করা একটি ফাংশন । এটি পরিবার থেকে toString, toExponentialএবং toPrecision

একটি সংখ্যা গোল করতে, আপনি এটি করবেন:

someNumber = 42.008;
someNumber = Math.round( someNumber * 1e2 ) / 1e2;
someNumber === 42.01;

// if you need 3 digits, replace 1e2 with 1e3 etc.
// or just copypaste this function to your code:

function toFixedNumber(num, digits, base){
  var pow = Math.pow(base||10, digits);
  return Math.round(num*pow) / pow;
}

অথবা আপনি যদি " দেশীয়-মত " ফাংশন চান তবে আপনি প্রোটোটাইপটি প্রসারিত করতে পারেন:

Number.prototype.toFixedNumber = function(digits, base){
  var pow = Math.pow(base||10, digits);
  return Math.round(this*pow) / pow;
}
someNumber = 42.008;
someNumber = someNumber.toFixedNumber(2);
someNumber === 42.01;


//or even hexadecimal

someNumber = 0xAF309/256  //which is af3.09
someNumber = someNumber.toFixedNumber(1, 16);
someNumber.toString(16) === "af3.1";

তবে মনে রাখবেন যে মডিউলটি লেখার সময় প্রোটোটাইপকে দূষিত করা খারাপ বলে বিবেচিত হয়, কারণ মডিউলগুলির কোনও পার্শ্ব প্রতিক্রিয়া হওয়া উচিত নয়। সুতরাং, একটি মডিউল জন্য, প্রথম ফাংশন ব্যবহার করুন


12
আমি মনে করি এটিই সেরা উত্তর। এটি ধরণের রূপান্তর এড়ায়। জট্টিল-সস!
ফিল

1
দুর্দান্ত উত্তর! যাইহোক ... আমি 20 বছর বা তার মতো জাভাস্ক্রিপ্ট করছি, তবে আপনি কেন রিটার্ন ভ্যালুটির সাথে + (...) নির্মাণ ব্যবহার করছেন তা আমি বুঝতে পারি না? এটি ঘষার জন্য ধন্যবাদ @ স্যাম :) :) আমি শেখার মতো কখনই বয়স্ক না তাই দয়া করে বিশদভাবে বর্ণনা করুন :-)
হামারএনএল

1
@ হ্যামারএনএল স্যামের দৃiction় বিশ্বাস থাকা সত্ত্বেও, তা তাত্পর্যপূর্ণভাবে কিছুই করে না :) এটি কেবল একটি অনুশীলন - এটি আইডিইগুলি এই ফাংশনটিকে স্বীকৃতি দেয় type Number। জিনিসটি হ'ল +(anyValue)সর্বদা একটি নম্বর দেয় - যেমন। +("45")আয় 45, +(new Number(42))আয় 42। এটি শক্তিশালী টাইপ ফাংশন মত। আপনি যদি এটির অভ্যাস তৈরি করেন তবে আপনি প্রচুর বাগ এড়াতে পারবেন :)
m93a

কেন এটি মূল জাভাস্ক্রিপ্টে বেক করা হচ্ছে না: s
ওয়েবমাস্টার

2
এর পুনরুত্থান someNumber = Math.round( 42.008 * 1e2 ) / 1e2;হয় না 42.01, এটি ~42.0099999999999980। কারণ: সংখ্যাটি 42.01বিদ্যমান নেই এবং এটি নিকটতম বিদ্যমান সংখ্যায় গোলাকার। বিটিডব্লিউ, প্রুফ নম্বরগুলি toPrecision(18)এটি সমস্ত প্রাসঙ্গিক অঙ্ক সহ মুদ্রণের জন্য।
উইম্ম

118

এটি পরিবর্তন করে আমি এই সমস্যার সমাধান করেছি:

someNumber = someNumber.toFixed(2)

... এটি:

someNumber = +someNumber.toFixed(2);

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


39
না না না না না! যে না ! সংখ্যাটিকে স্ট্রিং রূপান্তর করার পক্ষে এটি খুব খারাপ অভ্যাস ! পরিবর্তে না someNumber = Math.round(someNumber * 1e2) / 1e2! আমার উত্তরটি আরও সাধারণীকরণের জন্য দেখুন।
m93a

@ এম93 এ - কেন এমন খারাপ অভ্যাস?
jczaplew

3
@jczaplew কারণ যদি আপনি এটি এই ভাবে না, 32bit বাইনারি সংখ্যাকে একটি স্ট্রিং রূপান্তরিত হয়, যে আল্লাহর অভিশাপ দশমিক জন্য 16bits ব্যবহার অঙ্ক ! (যেভাবে আপনি ইউটিএফ -16 এ নম্বর সঞ্চিত করছেন এটি আপনার পক্ষে সবচেয়ে সুবিধাজনক জিনিস নয়)) এবং স্ট্রিংটি 32 বিট ভাসমান-পয়েন্ট নম্বরে রূপান্তরিত হওয়ার চেয়ে বেশি। অঙ্ক করে অঙ্ক করুন। (যদি আমি সঠিকভাবে পার্সিং অ্যালগরিদম বেছে নেওয়ার আগে অবশ্যই সমস্ত পরীক্ষাগুলি অগ্রাহ্য করি)) এবং এটি নিরর্থক বিবেচনা করে আপনি এটি ফ্লোটে 3 টি দ্রুত অপারেশন ব্যবহার করে করতে পারেন।
m93a

2
@ m93a তাই এটি কার্য সম্পাদনের কারণে? এটি কি কার্য সম্পাদনে লক্ষণীয় প্রভাব ফেলে?
সেবাস্তিয়ানব

2
@ জিসিজেপ্লিউ, কারণ স্ট্রিংগুলি (1) কার্যত ধীর এবং (2) তাত্ত্বিকভাবে ভুল।
পেসারিয়ার

29

কেন ব্যবহার parseFloatকরবেন না ?

var someNumber = 123.456;
someNumber = parseFloat(someNumber.toFixed(2));
alert(typeof(someNumber));
//alerts number

15

আমি জাভাস্ক্রিপ্ট এর Number()ফাংশন ব্যবহার করে এটিকে আবার সংখ্যায় রূপান্তর করে সমাধান করেছি

var x = 2.2873424;
x = Number(x.toFixed(2));

12

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


4

ফলাফলকে সংখ্যায় রূপান্তর করতে আপনি কেবল '+' ব্যবহার করতে পারেন।

var x = 22.032423;
x = +x.toFixed(2); // x = 22.03

3

কোনও সংখ্যার ফর্ম্যাট করার কথা থাকলে কী তা প্রত্যাশা করবেন? আপনার যদি একটি নম্বর থাকে তবে আপনি এটির সাথে খুব বেশি কিছু করতে পারবেন না, যেমন 2 == 2.0 == 2.00ইত্যাদি etc. তাই এটি একটি স্ট্রিং হতে হবে।


3

কেন এটি স্ট্রিং হতে হবে তার একটি উদাহরণ সরবরাহ করতে:

আপনি যদি 1.toFixed (2) ফর্ম্যাট করেন তবে আপনি '1.00' পাবেন।

এটি 1 এর মতো নয়, কারণ 1 এর 2 দশমিক নেই।


আমি জানি জাভাস্ক্রিপ্ট হুবহু পারফরম্যান্সের ভাষা নয়, তবে আপনি যদি এমন কিছু ব্যবহার করেন তবে রাউন্ডিংয়ের জন্য আরও ভাল পারফরম্যান্স পাওয়ার সম্ভাবনা রয়েছে: রাউন্ডওয়েলও = ম্যাথ.াউন্ড (মান * 100) * 0.01


2

কারণ এর প্রাথমিক ব্যবহার সংখ্যাগুলি প্রদর্শন করছে? আপনি যদি সংখ্যাগুলি গোল করতে চান Math.round()তবে উপযুক্ত কারণগুলি সহ ব্যবহার করুন ।


তবে এটি সংখ্যাগুলি প্রদর্শন করছে তাই এটি একটি "নম্বর" ফেরত দেওয়া উচিত নয়?
ডেরেক আদায়ের

3
@ ডেরেক: কেবল সেই পথেই এটি '42'একটি সংখ্যা ... যা এটি নয়। কেবল একটি স্ট্রিংয়ের সাথে অঙ্কগুলি থাকে যা এটি কেবল একটি সংখ্যা করে না। এটি পিএইচপি নয়। :
ক্রিস জেস্টার-ইয়াং

হাঃ হাঃ হাঃ. এটি কোনও স্ট্রিং নয় যা একটি সংখ্যা রয়েছে ... এটি এমন একটি সংখ্যা যা কোনও পদ্ধতিতে পাস করা হয়। পদ্ধতিটি একটি সংখ্যা নেয় এবং একটি স্ট্রিং দেয়।
ডেরেক আদায়ের

@ ডেরেকএডায়ার ঠিক আছে তবে একটি ব্রাউজার কোনও সংখ্যা প্রদর্শন করতে পারে না, এটি স্ট্রিংগুলি প্রদর্শন করে, সুতরাং রূপান্তরটি।
নিক এম

1

m93aপ্রদত্ত উত্তরের কিছুটা কার্যকরী সংস্করণ এখানে ।

const toFixedNumber = (toFixTo = 2, base = 10) => num => {
  const pow = Math.pow(base, toFixTo)
  return +(Math.round(num * pow) / pow)
}

const oneNumber = 10.12323223

const result1 = toFixedNumber(2)(oneNumber) // 10.12
const result2 = toFixedNumber(3)(oneNumber) // 10.123

// or using pipeline-operator
const result3 = oneNumber |> toFixedNumber(2) // 10.12

এটি কার্যকর কাজ, অপরিজ্ঞাত ধরণের জন্য এটি কাজ করে না, আমি এই ক্ষেত্রে কোড যুক্ত করেছি; যদি (num! == অপরিবর্তিত) {রিটার্ন + (ম্যাথ.াউন্ড (নাম্বার * পাও / পাও)) অন্য {0 ফেরত; }
ডিনো লিউ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.