سؤال

لدي وظيفة لجولة عدد معين إلى الوظيفة إلى أقرب بنسات كاملة.

<script type='text/javascript'>
Math.roundNumber = function(a,b){
    if(!isNaN(parseInt(a))){
        c = Math.pow(10,b);
        return (Math.round(a*c)/c);
    }
    return false;
}
</script>

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

على سبيل المثال

15.236562213541684 سيكون = 15.24 9846.65456169846 سوف = 9846.66

اعتقدت أنها ستكون مجرد حالة من تغيير العائد (الرياضياتنسخة)؛ للعودة (الرياضياتنسخة)؛

من الواضح أنني كنت مخطئا جدا.

أي مساعدة في هذه المسألة؟

** تعديل **

إليكم الصيغة التي أحاول تحقيقها ربما ستساعد

a = intrest price
b = terms
c = a/b
d = c*(b-1)
e = a-d

لذلك على سبيل المثال

a = 295.30
b = 156
c = 295.30/156 = 1.90 (rounded up to nearest decimal as above)
d = 1.90 * (b-1) = 294.50
e = 295.30 - 294.50 = 0.80

هل يمكن لأي شخص يمين وظيفة للقيام أعلاه؟

هنا هو رابط إلى الرمز الحالي، بما في ذلك الصيغة ... لها صيغة قديمة جدا التي قمت بها عندما بدأت لأول مرة javaScript (التي أصبحت منذ فترة الآن) ومع ذلك، لا أزال الآن أفضل الآن لأنني عدت بعد ذلك.

هل يمكن لأي شخص تنظيفه لمعرفة ما إذا كان بإمكانهم معرفة سبب عدم العمل على مطابقة الوظيفة أعلاه؟

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

المحلول

function currency_fix(number)
{
    var unfixed_number = Math.ceil(number.toFixed(5) * 100) / 100;
    return unfixed_number.toFixed(2)
}

var a = currency_fix(295.30)
var b = currency_fix(156)
var c = currency_fix(a / b)
var d = currency_fix(c * (b - 1))
var e = currency_fix(a - d)

document.write(
    'a = ' + a + '<br />' +
    'b = ' + b + '<br />' +
    'c = ' + c + '<br />' +
    'd = ' + d + '<br />' +
    'e = ' + e + '<br />'
)

// OUTPUT
//a = 295.30
//b = 156.00
//c = 1.90
//d = 294.50
//e = 0.80

حصلت عليه لإعطاء النتائج التي تريدها في هذه الحالة. لست متأكدا مما إذا كان سيعمل في كل مرة ولكن يبدو ذلك. بالتأكيد التحقق من أنه يعمل كما تريد ذلك أولا.

نصائح أخرى

هناك وظيفة مدمجة لهذا بالفعل، Number.toFixed(numDigits), ، لماذا لا تستخدم هذا؟

المعلمة: الأرقام
عدد الأرقام لتظهر بعد النقطة العشرية؛ قد تكون هذه قيمة بين 0 و 20، شاملة، وقد تؤيد التطبيقات اختياريا مجموعة أكبر من القيم. إذا تم حذف هذه الحجة، فسيتم التعامل معها باسم 0.

عائدات:
تمثيل سلسلة العدد الذي لا يستخدم الترميز الأسي ولديه أرقام تماما بعد المكان العشري. يتم تقريب الرقم إذا لزم الأمر، والجزء الكسري مبطن بالأصفار إذا لزم الأمر بحيث يحتوي على الطول المحدد. إذا كان الرقم أكبر من 1E + 21، فإن هذه الطريقة ببساطة تستدعي Number.toString () وإرجاع سلسلة في الترميز الأسي.

مثال:

>>> new Number(15.236562213541684).toFixed(2);
"15.24"
>>> new Number(9846.65456169846).toFixed(2);
"9846.65"

هذا الأخير لا يتطابق مع مثالك - 9846.65456169846 تقريب إلى اثنين من الأماكن العشرية يجب أن يكون 9846.65, ، ليس 9846.66.

الكود الخاص بك هو أكثر تعقيدا مما تحتاجه لهذه المهمة. إذا كنت تعرف أن النقطة العشرية سيمثل دائما قيمة مستقرة بغض النظر عن طول الأرقام على جانبي تلك النقطة العشرية التي كنت في حظ.

1) ثم يجب عليك فقط عدة رقم الأصلي بنسبة 100

2) إذا (الرقم (x.charat (indexof (".") + 1)> 4) {x + = 1} حيث x هو رقمك

3) بخلاف

4) تقسيم بنسبة 100 وأنت انتهيت.

نصيحة لاستخدام الحساب ثابت النقطة هي نصيحة جيدة. لسوء الحظ، لا يوجد حساب حسابي محدد في جافا سكريبت - جميع الأرقام هي أرقام نقطة عائمة مزدوجة الدقة. (حسنا، لا حساب حسابي ثابت دون سحب في بعض مكتبة الدعم الصريح.)

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

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

استبدال Math.round() مع Math.ceil() يجب أن تعمل: يجب أن يكون الخطأ في مكان آخر.

أيضا، أقترح إسقاط isNaN(parseInt()) تماما كما ستؤدي وظائف الرياضيات إلى الرقم على أي حال، والعودة NaN إذا كان هذا غير ممكن. هذا سيؤدي إلى عودة الوظيفة NaN كذلك، وهو أمر مناسب أفضل من المنطقية false.

راجع للشغل: إنها فكرة سيئة استخدام الرياضيات الفاصلة العائمة بالقيم النقدية: استخدم الحساب النقطة الثابتة بدلا من ذلك!


الآن بعد أن نعرف ما تحاول القيام به، إليك الرمز الذي يحسب القيم المرغوبة على سبيل المثال:

var value = 295.30;
var count = 156;
var payment = Math.ceil(value * 100 / count) / 100;
var last_payment = Math.round((value - (count - 1) * payment) * 100) / 100;

تغيير round() ل ceil() بالنسبة لجميع الحسابات، لم تنجح الدفعة الأخيرة بشكل طبيعي لتعويض عدم الدقة بسبب استخدام قيم النقطة العائمة.

من الأفضل بشكل عام استخدام الرياضيات الصحيحة فقط، لذلك اضرب جميع القيم 100 وتحويل فقط عند إخراج القيم:

var value = 29530;
var count = 156;
var payment = Math.ceil(value / count);
// rounding no longer necessary as integer math is precise:
var last_payment = value - (count - 1) * payment;

لا، كنت على حق.

اختبرت الكود الخاص بك مع Modifictaion Ceil، ويعمل.

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