javascript - गौसियन/बैंकर की जावास्क्रिप्ट में गोलाई




rounding (4)

मैं अपने सर्वर-साइड राउंडिंग करने के लिए C # में Math.Round(myNumber, MidpointRounding.ToEven) का उपयोग कर रहा हूं, हालांकि, उपयोगकर्ता को 'लाइव' जानने की जरूरत है कि सर्वर-साइड ऑपरेशन का परिणाम क्या होगा, जिसका अर्थ है (टालना) Ajax अनुरोध) C # द्वारा उपयोग किए गए MidpointRounding.ToEven विधि को दोहराने के लिए एक जावास्क्रिप्ट विधि का निर्माण।

MidpointRounding.ToEven गाऊसी / बैंकर की गोलाई है , here वर्णित लेखा प्रणालियों के लिए एक बहुत ही सामान्य गोलाई विधि here

क्या किसी को इसका कोई अनुभव है? मुझे उदाहरण ऑनलाइन मिले हैं, लेकिन वे दिए गए दशमलव स्थानों की संख्या में गोल नहीं हैं ...


यह @soegaard से एक महान समाधान है। यहाँ एक छोटा सा परिवर्तन है जो दशमलव बिंदुओं के लिए काम करता है:

bankers_round(n:number, d:number=0) {
    var x = n * Math.pow(10, d);
    var r = Math.round(x);
    var br = (((((x>0)?x:(-x))%1)===0.5)?(((0===(r%2)))?r:(r-1)):r);
    return br / Math.pow(10, d);
}

और इसके दौरान - यहाँ कुछ परीक्षण हैं:

console.log(" 1.5 -> 2 : ", bankers_round(1.5) );
console.log(" 2.5 -> 2 : ", bankers_round(2.5) );
console.log(" 1.535 -> 1.54 : ", bankers_round(1.535, 2) );
console.log(" 1.525 -> 1.52 : ", bankers_round(1.525, 2) );

console.log(" 0.5 -> 0 : ", bankers_round(0.5) );
console.log(" 1.5 -> 2 : ", bankers_round(1.5) );
console.log(" 0.4 -> 0 : ", bankers_round(0.4) );
console.log(" 0.6 -> 1 : ", bankers_round(0.6) );
console.log(" 1.4 -> 1 : ", bankers_round(1.4) );
console.log(" 1.6 -> 2 : ", bankers_round(1.6) );

console.log(" 23.5 -> 24 : ", bankers_round(23.5) );
console.log(" 24.5 -> 24 : ", bankers_round(24.5) );
console.log(" -23.5 -> -24 : ", bankers_round(-23.5) );
console.log(" -24.5 -> -24 : ", bankers_round(-24.5) );

यह असामान्य स्टैकओवरफ़्लो है जहां नीचे के उत्तर स्वीकृत से बेहतर हैं। बस @xims समाधान को साफ किया और थोड़ा और सुपाठ्य बनाया:

function bankersRound(n, d=2) {
    var x = n * Math.pow(10, d);
    var r = Math.round(x);
    var br = Math.abs(x) % 1 === 0.5 ? (r % 2 === 0 ? r : r-1) : r;
    return br / Math.pow(10, d);
}

स्वीकृत उत्तर दिए गए स्थानों के लिए गोल होता है। इस प्रक्रिया में इसे फिक्स कहा जाता है जो संख्या को एक स्ट्रिंग में परिवर्तित करता है। चूंकि यह महंगा है, मैं नीचे दिए गए समाधान की पेशकश करता हूं। यह संख्या को 0.5 में समाप्‍त समाप्‍त समाप्‍ति पर राउंड करता है। यह मनमाने ढंग से कई स्थानों पर चक्कर नहीं लगाता।

function even_p(n){
  return (0===(n%2));
};

function bankers_round(x){
    var r = Math.round(x);
    return (((((x>0)?x:(-x))%1)===0.5)?((even_p(r))?r:(r-1)):r);
};

const isEven = (value: number) => value % 2 === 0;
const isHalf = (value: number) => {
    const epsilon = 1e-8;
    const remainder = Math.abs(value) % 1;

    return remainder > .5 - epsilon && remainder < .5 + epsilon;
};

const roundHalfToEvenShifted = (value: number, factor: number) => {
    const shifted = value * factor;
    const rounded = Math.round(shifted);
    const modifier = value < 0 ? -1 : 1;

    return !isEven(rounded) && isHalf(shifted) ? rounded - modifier : rounded;
};

const roundHalfToEven = (digits: number, unshift: boolean) => {
    const factor = 10 ** digits;

    return unshift
        ? (value: number) => roundHalfToEvenShifted(value, factor) / factor
        : (value: number) => roundHalfToEvenShifted(value, factor);
};

const roundDollarsToCents = roundHalfToEven(2, false);
const roundCurrency = roundHalfToEven(2, true);
  • यदि आप कॉल करने के ओवरहेड पसंद नहीं है
  • एक मनमाना पैमाने की आपूर्ति करने में सक्षम होना चाहते हैं
  • फ्लोटिंग-पॉइंट त्रुटियों को लागू नहीं करना चाहते हैं
  • पठनीय, पुन: प्रयोज्य कोड चाहते हैं

roundHalfToEven एक फ़ंक्शन है जो एक निश्चित स्केल राउंडिंग फ़ंक्शन उत्पन्न करता है। मैं FPEs शुरू करने से बचने के लिए डॉलर के बजाय सेंट पर अपना मुद्रा संचालन करता हूं। बिना ऑपरेशन के ओवरहेड से बचने और उन ऑपरेशनों के लिए फिर से शिफ्ट करने के लिए अशिफ्ट परम मौजूद है।






rounding