আমি কি এখানে কিছু মিস করছি?
var someNumber = 123.456;
someNumber = someNumber.toFixed(2);
alert(typeof(someNumber));
//alerts string
কেন.toFixed()
একটি স্ট্রিং ফিরেআসে?
আমি সংখ্যাটি 2 দশমিক সংখ্যায় গোল করতে চাই।
আমি কি এখানে কিছু মিস করছি?
var someNumber = 123.456;
someNumber = someNumber.toFixed(2);
alert(typeof(someNumber));
//alerts string
কেন.toFixed()
একটি স্ট্রিং ফিরেআসে?
আমি সংখ্যাটি 2 দশমিক সংখ্যায় গোল করতে চাই।
উত্তর:
এটি একটি স্ট্রিং প্রত্যাবর্তন করে কারণ 0.1, এবং এর শক্তিগুলি (যা দশমিক ভগ্নাংশ প্রদর্শন করতে ব্যবহৃত হয়) বাইনারি ভাসমান-পয়েন্ট সিস্টেমগুলিতে প্রতিনিধিত্বযোগ্য নয় (অন্তত সম্পূর্ণ নির্ভুলতার সাথে নয়)।
উদাহরণস্বরূপ, 0.1 হ'ল 0.1000000000000000055511151231257827021181583404541015625, এবং 0.01 আসলে 0.01000000000000000020816681711721685132943093776702880859375। ( BigDecimal
আমার বক্তব্য প্রমাণ করার জন্য ধন্যবাদ । :- পি)
অতএব (দশমিক ভাসমান বিন্দু বা যৌক্তিক সংখ্যা প্রকারের অনুপস্থিত), স্ট্রিং হিসাবে আউটপুট দেওয়া হ'ল এটি প্রদর্শনের জন্য প্রয়োজনীয় নির্ভুলতার সাথে ছাঁটাই করার একমাত্র উপায়।
toFixed
একটি বিন্যাসকরণ ফাংশন, যার একটি নির্দিষ্ট সংখ্যাকে দশমিকের সংখ্যার সাহায্যে বিন্যাসকরণকে স্ট্রিংয়ে রূপান্তর করার একমাত্র উদ্দেশ্য রয়েছে। এটি একটি স্ট্রিং ফেরত দেওয়ার কারণ হ'ল এটি একটি স্ট্রিং ফেরত দেওয়ার কথা, এবং যদি এর toStringFixed
পরিবর্তে নামকরণ করা হয়, ফলাফলগুলি দেখে ওপি অবাক হবে না। এখানে একমাত্র বিষয়টি হ'ল ওএস Math.round
জেএস রেফারেন্সের সাথে পরামর্শ না করেই এটির মতো কাজ করবে বলে আশা করেছিল ।
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";
তবে মনে রাখবেন যে মডিউলটি লেখার সময় প্রোটোটাইপকে দূষিত করা খারাপ বলে বিবেচিত হয়, কারণ মডিউলগুলির কোনও পার্শ্ব প্রতিক্রিয়া হওয়া উচিত নয়। সুতরাং, একটি মডিউল জন্য, প্রথম ফাংশন ব্যবহার করুন ।
type Number
। জিনিসটি হ'ল +(anyValue)
সর্বদা একটি নম্বর দেয় - যেমন। +("45")
আয় 45
, +(new Number(42))
আয় 42
। এটি শক্তিশালী টাইপ ফাংশন মত। আপনি যদি এটির অভ্যাস তৈরি করেন তবে আপনি প্রচুর বাগ এড়াতে পারবেন :)
someNumber = Math.round( 42.008 * 1e2 ) / 1e2;
হয় না 42.01
, এটি ~42.0099999999999980
। কারণ: সংখ্যাটি 42.01
বিদ্যমান নেই এবং এটি নিকটতম বিদ্যমান সংখ্যায় গোলাকার। বিটিডব্লিউ, প্রুফ নম্বরগুলি toPrecision(18)
এটি সমস্ত প্রাসঙ্গিক অঙ্ক সহ মুদ্রণের জন্য।
এটি পরিবর্তন করে আমি এই সমস্যার সমাধান করেছি:
someNumber = someNumber.toFixed(2)
... এটি:
someNumber = +someNumber.toFixed(2);
তবে এটি সংখ্যাটিকে স্ট্রিংয়ে রূপান্তর করবে এবং এটি আবার বিশ্লেষণ করবে, যা কার্য সম্পাদনে গুরুত্বপূর্ণ প্রভাব ফেলবে। আপনি যদি পারফরম্যান্স বা টাইপ সুরক্ষা সম্পর্কে যত্নশীল হন তবে অন্য উত্তরগুলিও পরীক্ষা করে দেখুন।
someNumber = Math.round(someNumber * 1e2) / 1e2
! আমার উত্তরটি আরও সাধারণীকরণের জন্য দেখুন।
কেন ব্যবহার parseFloat
করবেন না ?
var someNumber = 123.456;
someNumber = parseFloat(someNumber.toFixed(2));
alert(typeof(someNumber));
//alerts number
অবশ্যই এটি একটি স্ট্রিং দেয়। আপনি যদি সংখ্যার পরিবর্তনশীলকে গোল করতে চান তবে আপনি পরিবর্তে ম্যাথ.আউট () ব্যবহার করবেন। টু ফিক্সডের পয়েন্টটি ব্যবহারকারীর কাছে প্রদর্শনের জন্য নির্দিষ্ট সংখ্যক দশমিক জায়গার সংখ্যার বিন্যাস করা ।
কেন এটি স্ট্রিং হতে হবে তার একটি উদাহরণ সরবরাহ করতে:
আপনি যদি 1.toFixed (2) ফর্ম্যাট করেন তবে আপনি '1.00' পাবেন।
এটি 1 এর মতো নয়, কারণ 1 এর 2 দশমিক নেই।
আমি জানি জাভাস্ক্রিপ্ট হুবহু পারফরম্যান্সের ভাষা নয়, তবে আপনি যদি এমন কিছু ব্যবহার করেন তবে রাউন্ডিংয়ের জন্য আরও ভাল পারফরম্যান্স পাওয়ার সম্ভাবনা রয়েছে: রাউন্ডওয়েলও = ম্যাথ.াউন্ড (মান * 100) * 0.01
কারণ এর প্রাথমিক ব্যবহার সংখ্যাগুলি প্রদর্শন করছে? আপনি যদি সংখ্যাগুলি গোল করতে চান Math.round()
তবে উপযুক্ত কারণগুলি সহ ব্যবহার করুন ।
'42'
একটি সংখ্যা ... যা এটি নয়। কেবল একটি স্ট্রিংয়ের সাথে অঙ্কগুলি থাকে যা এটি কেবল একটি সংখ্যা করে না। এটি পিএইচপি নয়। :
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