首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JavaScript中的高斯/银行家舍入

JavaScript中的高斯/银行家舍入
EN

Stack Overflow用户
提问于 2010-06-24 18:13:12
回答 7查看 12.2K关注 0票数 73

我一直在使用C#中的Math.Round(myNumber, MidpointRounding.ToEven)进行服务器端舍入,但是,用户需要‘实时’知道服务器端操作的结果,这意味着(避免Ajax请求)创建一个JavaScript方法来复制C#使用的MidpointRounding.ToEven方法。

MidpointRounding.ToEven是高斯/banker's rounding,这是here描述的会计系统的一种非常常见的舍入方法。

有没有人有这方面的经验?我在网上找到了一些例子,但它们不会在给定小数位数的情况下舍入到……

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-06-24 18:46:42

代码语言:javascript
复制
function evenRound(num, decimalPlaces) {
    var d = decimalPlaces || 0;
    var m = Math.pow(10, d);
    var n = +(d ? num * m : num).toFixed(8); // Avoid rounding errors
    var i = Math.floor(n), f = n - i;
    var e = 1e-8; // Allow for rounding errors in f
    var r = (f > 0.5 - e && f < 0.5 + e) ?
                ((i % 2 == 0) ? i : i + 1) : Math.round(n);
    return d ? r / m : r;
}

console.log( evenRound(1.5) ); // 2
console.log( evenRound(2.5) ); // 2
console.log( evenRound(1.535, 2) ); // 1.54
console.log( evenRound(1.525, 2) ); // 1.52

现场演示:http://jsfiddle.net/NbvBp/

对于看起来更严格的处理(我从未使用过它),您可以尝试这个BigNumber实现。

票数 103
EN

Stack Overflow用户

发布于 2018-03-03 13:04:22

这是一种不同寻常的堆栈溢出,底部的答案比被接受的答案更好。刚刚清理了@xims解决方案,并使其更易读:

代码语言:javascript
复制
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);
}
票数 11
EN

Stack Overflow用户

发布于 2015-08-28 21:11:34

被接受的答案确实四舍五入到给定的位置数。在这个过程中,它调用toFixed将数字转换为字符串。由于这是昂贵的,我提供了下面的解决方案。它将以0.5结尾的数字舍入到最接近的偶数。它不处理四舍五入到任意数量的位。

代码语言:javascript
复制
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);
};
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3108986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档