سؤال

في JavaScript، فإن الطريقة النموذجية لجولة عدد إلى الأماكن العشرية هي شيء مثل:

function roundNumber(num, dec) {
  return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
}

function roundNumber(num, dec) {
  return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
}

console.log(roundNumber(0.1 + 0.2, 2));
console.log(roundNumber(2.1234, 2));

لكن هذا النهج سوف جولة إلى أقصى من الأماكن العشرية بينما أريد دائماً جولة إلى الأماكن العشرية. على سبيل المثال "2.0" سيتم تقريبها إلى "2".

أيه أفكار؟

هل كانت مفيدة؟

المحلول

هذا ليس مشكلة التقريب، هذه مشكلة العرض. لا يحتوي الرقم على معلومات حول أرقام مهمة؛ القيمة 2 هي نفسها 2.0000000000000. .

يمكنك فقط إضافة الأصفار بعد الرقم، شيء مثل:

var s = number.toString();
if (s.indexOf('.') == -1) s += '.';
while (s.length < s.indexOf('.') + 4) s += '0';

(لاحظ أن هذا يفترض أن الإعدادات الإقليمية للعميل تستخدم الفترة كفاصل عشري، يحتاج الرمز إلى بعض العمل الإضافي للعمل من أجل إعدادات أخرى.)

نصائح أخرى

أعتقد أن هناك نهجا أكثر بسيطة للجميع المعطى هنا، وهو الطريقة Number.toFixed() نفذت بالفعل في جافا سكريبت.

ببساطة اكتب:

var myNumber = 2;

myNumber.toFixed(2); //returns "2.00"
myNumber.toFixed(1); //returns "2.0"

إلخ...

لقد وجدت وسيلة. هذا هو رمز كريستوف مع الإصلاح:

function toFixed(value, precision) {
    var precision = precision || 0,
        power = Math.pow(10, precision),
        absValue = Math.abs(Math.round(value * power)),
        result = (value < 0 ? '-' : '') + String(Math.floor(absValue / power));

    if (precision > 0) {
        var fraction = String(absValue % power),
            padding = new Array(Math.max(precision - fraction.length, 0) + 1).join('0');
        result += '.' + padding + fraction;
    }
    return result;
}

اقرأ تفاصيل تكرار حرف باستخدام منشئ صفيف هنا إذا كنت فضوليا لماذا أضفت "+ 1".

هناك دائما طريقة أفضل للقيام بالأشياء.

var number = 51.93999999999761;

أرغب في الحصول على أربعة أرقام دقيقة: 51.94

فقط تفعل:

number.toPrecision(4);

ستكون النتيجة: 51.94

طريقة التقريب مثل PHP

يمكن استخدام الرمز أدناه لإضافة إصدارك الخاص من Math.Round إلى مساحة الاسم الخاصة بك والتي تأخذ معلمة دقيقة. على عكس التقريب العشري في المثال أعلاه، لا يؤدي هذا إلى أي تحويل من وإلى الأوتار، ويعمل المعلمة الدقة نفسها مثل PHP و Excel حيث ستتم جولة 1 جولة واحدة إيجابية إلى مكان عشري و -1 جولة إلى عشرات.

var myNamespace = {};
myNamespace.round = function(number, precision) {
    var factor = Math.pow(10, precision);
    var tempNumber = number * factor;
    var roundedTempNumber = Math.round(tempNumber);
    return roundedTempNumber / factor;
};

myNamespace.round(1234.5678, 1); // 1234.6
myNamespace.round(1234.5678, -1); // 1230

من عند مرجع مطور Mozilla للرياضيات.

نأمل رمز العمل (لم يفعل الكثير من الاختبار):

function toFixed(value, precision) {
    var precision = precision || 0,
        neg = value < 0,
        power = Math.pow(10, precision),
        value = Math.round(value * power),
        integral = String((neg ? Math.ceil : Math.floor)(value / power)),
        fraction = String((neg ? -value : value) % power),
        padding = new Array(Math.max(precision - fraction.length, 0) + 1).join('0');

    return precision ? integral + '.' +  padding + fraction : integral;
}

يعمل هذا على التقريب إلى N أرقام (إذا كنت ترغب فقط في الاقتطاع إلى N أرقام إزالة مكالمة Math.Round واستخدام Math.Trong One):

function roundN(value, digits) {
   var tenToN = 10 ** digits;
   return /*Math.trunc*/(Math.round(value * tenToN)) / tenToN;
}

كان عليه أن يلجأ إلى هذا المنطق في جافا في الماضي عندما كنت أهلا مكونات المعالجة الإلكترونية. وبعد وهذا منذ أن اكتشفت أن إضافة 0.1 عدة مرات إلى 0 كنت في نهاية المطاف مع بعض الجزء عشري طويل غير متوقع (هذا بسبب الحسابي النقطة العائمة).

تعليق المستخدم في رقم التنسيق لإظهار 2 منازل عشرية يدعو إلى تحجيم هذه التقنية.

ذكر البعض أن هناك حالات لا تتجول كما هو متوقع وفي http://www.jacklmoore.com/Notes/Rounding-in-javascript/ يقترح ذلك بدلا من ذلك:

function round(value, decimals) {
  return Number(Math.round(value+'e'+decimals)+'e-'+decimals);
}

إليك رابط إلى JavaScript Sprinthf،

http://www.webolkit.info/javascript-sprintf.html.

دعوة إلى Sprintf () هي منهجية تقريب واحدة في بيرل، لكن JavaScript لا تملك هذه الوظيفة الأصلية.

http://perldoc.perl.org/functions/sprintf.html.

هل هذا يساعد؟

أعتقد أن وظيفة أدناه يمكن أن تساعد

function roundOff(value,round) {
   return (parseInt(value * (10 ** (round + 1))) - parseInt(value * (10 ** round)) * 10) > 4 ? (((parseFloat(parseInt((value + parseFloat(1 / (10 ** round))) * (10 ** round))))) / (10 ** round)) : (parseFloat(parseInt(value * (10 ** round))) / ( 10 ** round));
}

الاستعمال: roundOff(600.23458,2); سيعود 600.23

إذا كنت لا تهتم حقا في التقريب، فأضف فقط TOFIXED (X) ثم إزالة 0ES Traveling و Dot إذا لزم الأمر. ليس حل سريع.

function format(value, decimals) {
    if (value) {
        value = value.toFixed(decimals);            
    } else {
        value = "0";
    }
    if (value.indexOf(".") < 0) { value += "."; }
    var dotIdx = value.indexOf(".");
    while (value.length - dotIdx <= decimals) { value += "0"; } // add 0's

    return value;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top