উত্তর:
var result = Math.round(original*100)/100;
কোডটি স্ব-ব্যাখ্যামূলক না হলে সুনির্দিষ্ট ।
সম্পাদনা: ... বা কেবল ব্যবহার করুন toFixed
, টিম বাথের প্রস্তাবিত হিসাবে । স্মরণ করিয়ে দেওয়ার জন্য এটি ভুলে গেছেন, ধন্যবাদ (এবং একটি উত্তম) :)
toFixed()
printf()
সি তে কিছু করার মতো কি হবে তা নকল করে দিবে তবে toFixed()
এবং Math.round()
বিভিন্নভাবে গোলকে পরিচালনা করবে। এই ক্ষেত্রে, toFixed()
প্রভাব একই সাজানোর থাকবে Math.floor()
হবে (মঞ্জুর 10 করে মূল গুন করছি ^ এন পূর্বেই, আর কলিং আছে toFixed()
এন সংখ্যার সহ)। উত্তরের "নির্ভুলতা" ওপি এখানে কী চায় তার উপর খুব নির্ভর করে এবং উভয়ই তাদের নিজস্ব উপায়ে "সঠিক"।
রাউন্ড সংখ্যার ফাংশন রয়েছে। উদাহরণ স্বরূপ:
var x = 5.0364342423;
print(x.toFixed(2));
5.04 মুদ্রণ করা হবে।
সম্পাদনা: ফিজল
var x = 5.036432346; var y = x.toFixed(2) + 100;
y
সমান হবে"5.03100"
(0.335).toFixed(2) == 0.34 == (0.345).toFixed(2)
…
ব্যবহার করার সময় সতর্কতা অবলম্বন করুন toFixed()
:
প্রথমত, সংখ্যার বৃত্তাকার উপস্থাপনা ব্যবহার করে সংখ্যার বৃত্তাকার কাজ করা হয় যা অপ্রত্যাশিত আচরণের দিকে পরিচালিত করতে পারে। উদাহরণ স্বরূপ
(0.595).toFixed(2) === '0.59'
পরিবর্তে '0.6'
।
দ্বিতীয়ত, এখানে একটি আই.ই. বাগ রয়েছে toFixed()
। আইই (কমপক্ষে সংস্করণ 7 পর্যন্ত, আই 88 পরীক্ষা করে না), নিম্নলিখিতটি সত্য বলে ধরেছে:
(0.9).toFixed(0) === '0'
Kkyy এর পরামর্শ অনুসরণ করা বা একটি কাস্টম toFixed()
ফাংশন ব্যবহার করা যেমন একটি ভাল ধারণা হতে পারে , যেমন
function toFixed(value, precision) {
var power = Math.pow(10, precision || 0);
return String(Math.round(value * power) / power);
}
.toFixed()
রিটার্ন ভ্যালুতে দেশীয় পদ্ধতি যুক্ত করার পরামর্শ দেব , যা প্রয়োজনীয় পরিমাণ নির্ভুলতা যুক্ত করবে, যেমন: return (Math.round(value * power) / power).toFixed(precision);
এবং মানটিকে স্ট্রিং হিসাবেও ফিরিয়ে দেয়। অন্যথায়, 20 এর নির্ভুলতা ছোট দশমিকের জন্য উপেক্ষা করা হবে
toFixed
: নোট করুন যে নির্ভুলতা বৃদ্ধি করা অপ্রত্যাশিত ফলাফল আনতে পারে: (1.2).toFixed(16) === "1.2000000000000000"
যখন, (1.2).toFixed(17) === "1.19999999999999996"
(ফায়ারফক্স / ক্রোমে; আইই 8-তে পরবর্তীকালে আইই 8 অভ্যন্তরীণভাবে অফার করতে পারে এমন কম নির্ভুলতার কারণে এটি ধরা দেয় না)।
(0.598).toFixed(2)
উত্পাদন করে না দয়া করে নোট করুন 0.6
। এটি উত্পাদন করে 0.60
:)
(0.335).toFixed(2) == 0.34 == (0.345).toFixed(2)
।
আরও একটি সমস্যা সম্পর্কে সচেতন হতে হবে, সেটি হ'ল toFixed()
সংখ্যার শেষে অহেতুক শূন্য তৈরি করতে পারে। উদাহরণ স্বরূপ:
var x=(23-7.37)
x
15.629999999999999
x.toFixed(6)
"15.630000"
ধারণাটি হ'ল একটি ব্যবহার করে আউটপুট পরিষ্কার করা RegExp
:
function humanize(x){
return x.toFixed(6).replace(/\.?0*$/,'');
}
RegExp
নিশ্চিত করুন যে এটি পূর্ণসংখ্যার জন্য ভাল হিসাবে ভাল দেখায় করতে trailing শূন্য (এবং ঐচ্ছিকরূপে দশমিক পয়েন্ট) সাথে মেলে।
humanize(23-7.37)
"15.63"
humanize(1200)
"1200"
humanize(1200.03)
"1200.03"
humanize(3/4)
"0.75"
humanize(4/3)
"1.333333"
var x = 0.3445434
x = Math.round (x*100) / 100 // this will make nice rounding
গুণকগুলি ব্যবহার করে চারপাশে ভাসমান solutions সমস্ত সমাধানে একটি সমস্যা আছে। দুর্ভাগ্যক্রমে কিকি এবং ক্রিস্টোফের উভয় সমাধানই ভুল।
সংখ্যার জন্য আপনার কোড পরীক্ষা দয়া করে 551.175 2 দশমিক স্থান দিয়ে - এটি সুসম্পন্ন হবে 551,17 যখন এটি হওয়া উচিত 551,18 ! তবে আপনি যদি প্রাক্তন জন্য পরীক্ষা। 451.175 এটি ঠিক থাকবে - 451.18। সুতরাং এই ত্রুটিটিকে প্রথম নজরে চিহ্নিত করা শক্ত।
সমস্যাটি সংখ্যাবৃদ্ধির সাথে: 551.175 * 100 = 55117.49999999999 (আপগুলি!) চেষ্টা করে দেখুন
সুতরাং আমার ধারণাটি ম্যাথ.াউন্ড () ব্যবহার করার আগে টু ফিক্সড () দিয়ে চিকিত্সা করা;
function roundFix(number, precision)
{
var multi = Math.pow(10, precision);
return Math.round( (number * multi).toFixed(precision + 1) ) / multi;
}
toFixed
পাশাপাশি প্রভাবিত হয় - (0.335).toFixed(2) == 0.34 == (0.345).toFixed(2)
… যে কোনও পদ্ধতি ব্যবহার করা হোক না কেন, গোল করার আগে একটি অ্যাপসিলন আরও ভালভাবে যুক্ত করুন।
আমি এখানে অনুমান করা চাবিটি হ'ল প্রথমে সঠিকভাবে গোল করা, তারপরে আপনি এটিকে স্ট্রিংয়ে রূপান্তর করতে পারেন।
function roundOf(n, p) {
const n1 = n * Math.pow(10, p + 1);
const n2 = Math.floor(n1 / 10);
if (n1 >= (n2 * 10 + 5)) {
return (n2 + 1) / Math.pow(10, p);
}
return n2 / Math.pow(10, p);
}
// All edge cases listed in this thread
roundOf(95.345, 2); // 95.35
roundOf(95.344, 2); // 95.34
roundOf(5.0364342423, 2); // 5.04
roundOf(0.595, 2); // 0.60
roundOf(0.335, 2); // 0.34
roundOf(0.345, 2); // 0.35
roundOf(551.175, 2); // 551.18
roundOf(0.3445434, 2); // 0.34
এখন আপনি নিরাপদে এই মানটিকে ফিক্সড (পি) দিয়ে ফর্ম্যাট করতে পারবেন। সুতরাং আপনার নির্দিষ্ট ক্ষেত্রে:
roundOf(0.3445434, 2).toFixed(2); // 0.34
আপনি যদি রাউন্ড ছাড়াই স্ট্রিং চান তবে আপনি এই RegEx ব্যবহার করতে পারেন (সম্ভবত সবচেয়ে দক্ষ উপায় নয় ... তবে সত্যিই সহজ)
(2.34567778).toString().match(/\d+\.\d{2}/)[0]
// '2.34'
function trimNumber(num, len) {
const modulu_one = 1;
const start_numbers_float=2;
var int_part = Math.trunc(num);
var float_part = String(num % modulu_one);
float_part = float_part.slice(start_numbers_float, start_numbers_float+len);
return int_part+'.'+float_part;
}
return float_part ? int_part+'.'+float_part : int_part;
অন্যথায় আপনি যদি পূর্ণসংখ্যায় উত্তীর্ণ হন তবে এটি শেষে বিন্দু দিয়ে নম্বরটি ফিরে আসে (উদাহরণস্বরূপ ইনপুট 2100
2100.
সম্ভবত আপনিও দশমিক বিভাজক চাইবেন? আমি সবেমাত্র তৈরি একটি ফাংশন এখানে:
function formatFloat(num,casasDec,sepDecimal,sepMilhar) {
if (num < 0)
{
num = -num;
sinal = -1;
} else
sinal = 1;
var resposta = "";
var part = "";
if (num != Math.floor(num)) // decimal values present
{
part = Math.round((num-Math.floor(num))*Math.pow(10,casasDec)).toString(); // transforms decimal part into integer (rounded)
while (part.length < casasDec)
part = '0'+part;
if (casasDec > 0)
{
resposta = sepDecimal+part;
num = Math.floor(num);
} else
num = Math.round(num);
} // end of decimal part
while (num > 0) // integer part
{
part = (num - Math.floor(num/1000)*1000).toString(); // part = three less significant digits
num = Math.floor(num/1000);
if (num > 0)
while (part.length < 3) // 123.023.123 if sepMilhar = '.'
part = '0'+part; // 023
resposta = part+resposta;
if (num > 0)
resposta = sepMilhar+resposta;
}
if (sinal < 0)
resposta = '-'+resposta;
return resposta;
}
X.xx5 এর সাথে মূল্যের গুণাগুণ বা বিভাগকে ব্যবহার করে প্রকৃত মান হিসাবে অসামঞ্জস্যপূর্ণ বৃত্তাকার এড়ানোর কোনও উপায় নেই। আপনার যদি সঠিক মূল্যগুলির ক্লায়েন্ট-সাইড গণনা করতে হয় তবে আপনার সমস্ত পরিমাণ সেন্টে রাখা উচিত। এটি জাভাস্ক্রিপ্টে সংখ্যার মানগুলির অভ্যন্তরীণ উপস্থাপনের প্রকৃতির কারণে। লক্ষ্য করুন যে এক্সেল একই সমস্যায় ভুগছে তাই বেশিরভাগ লোকেরা এই ঘটনার ফলে ঘটে যাওয়া ছোট ত্রুটিগুলি লক্ষ্য করবেন না। তবে যখনই আপনি প্রচুর গণিত মান যুক্ত করেন ত্রুটিগুলি জমে উঠতে পারে, চূড়ান্ত ফলাফলের ত্রুটিটি হ্রাস করার জন্য গণনার ক্রম এবং অন্যান্য পদ্ধতির সাথে জড়িত একটি পুরো তত্ত্ব রয়েছে। দশমিক মান সহ সমস্যাগুলির উপর জোর দেওয়ার জন্য, দয়া করে নোট করুন যে 0.1 + 0.2 জাভাস্ক্রিপ্টে ঠিক 0.3 এর সমান নয়, যখন 1 + 2 3 এর সমান।
/** don't spend 5 minutes, use my code **/
function prettyFloat(x,nbDec) {
if (!nbDec) nbDec = 100;
var a = Math.abs(x);
var e = Math.floor(a);
var d = Math.round((a-e)*nbDec); if (d == nbDec) { d=0; e++; }
var signStr = (x<0) ? "-" : " ";
var decStr = d.toString(); var tmp = 10; while(tmp<nbDec && d*tmp < nbDec) {decStr = "0"+decStr; tmp*=10;}
var eStr = e.toString();
return signStr+eStr+"."+decStr;
}
prettyFloat(0); // "0.00"
prettyFloat(-1); // "-1.00"
prettyFloat(-0.999); // "-1.00"
prettyFloat(0.5); // "0.50"
আমি এই কোডটি ফ্লোটস ফর্ম্যাট করতে ব্যবহার করি। এটি ভিত্তিক toPrecision()
তবে এটি অপ্রয়োজনীয় শূন্যগুলি বাদ দেয়। আমি কীভাবে রেজেক্সকে সহজীকরণের জন্য পরামর্শগুলি স্বাগত জানাব।
function round(x, n) {
var exp = Math.pow(10, n);
return Math.floor(x*exp + 0.5)/exp;
}
ব্যবহারের উদাহরণ:
function test(x, n, d) {
var rounded = rnd(x, d);
var result = rounded.toPrecision(n);
result = result.replace(/\.?0*$/, '');
result = result.replace(/\.?0*e/, 'e');
result = result.replace('e+', 'e');
return result;
}
document.write(test(1.2000e45, 3, 2) + '=' + '1.2e45' + '<br>');
document.write(test(1.2000e+45, 3, 2) + '=' + '1.2e45' + '<br>');
document.write(test(1.2340e45, 3, 2) + '=' + '1.23e45' + '<br>');
document.write(test(1.2350e45, 3, 2) + '=' + '1.24e45' + '<br>');
document.write(test(1.0000, 3, 2) + '=' + '1' + '<br>');
document.write(test(1.0100, 3, 2) + '=' + '1.01' + '<br>');
document.write(test(1.2340, 4, 2) + '=' + '1.23' + '<br>');
document.write(test(1.2350, 4, 2) + '=' + '1.24' + '<br>');