Round() 四舍五入 js银行家算法

摘要:
首先,询问轮数返回的结果。让我们猜猜。首先,SQLserver返回0.83js。返回结果为0.83。代码如下:varb=0.825;警觉的事实上,toFixed函数可以直接在js中使用,varb=0.825;警觉的这也返回0.83,但C#返回0.82,这不是我们预期的0.83。为什么?

首先问一下round(0.825,2) 返回的结果,大家猜一猜,

首先SQL server 返回的是 0.83

Round() 四舍五入 js银行家算法第1张

js的返回结果 是0.83,code 如下:

  var b = 0.825;         alert(Math.round(b * 100) / 100); 其实js中可以 直接用toFixed函数的,

  var b = 0.825;         alert(b.toFixed(2));

这样也返回0.83

可是C# 返回的是0.82

       Round() 四舍五入 js银行家算法第2张

这里并不是我们期望的0.83, 为什么了? 其实C#中的Math.Round()并不是使用的"四舍五入"法 而是四舍六入五取偶(银行家算法 Banker's rounding),若需要舍入到的位的后面"小于5"或"大于5"的话,按通常意义的四舍五入处理.若"若需要舍入到的位的后面"等于5",则要看舍入后末位为偶数还是奇数.

Math.Round(1.25, 1) = 1.2 因为5前面是2,为偶数,所以把5舍去不进位 Math.Round(1.35, 1) = 1.4 因为5前面是3,为奇数,所以进位.

为了解决这个 问题,微软提供了其他的API

Round(Decimal, MidpointRounding)

Round(Double, MidpointRounding)

Round(Decimal, Int32, MidpointRounding)

Round(Double, Int32, MidpointRounding)

Round() 四舍五入 js银行家算法第3张

网上有人说 这个API 计算小数时有问题, 其实我们可以自己实现Round 函数,

 public static decimal Round(decimal d, int decimals)
        {
            decimal tenPow = Convert.ToDecimal(Math.Pow(10, decimals));
            decimal scrD = d * tenPow + 0.5m;
            return (Convert.ToDecimal(Math.Floor(Convert.ToDouble(scrD))) / tenPow);
        }  

 或者如下,

 public static decimal Round(decimal d, int decimals)
        {
            d = d + 0.000000000000001m;
            return Decimal.Round(d, decimals);
        }  

如果我们现在需要 用js 来实现 银行家算法,又该怎么实现了

Number.prototype.round = function (len) {
    var old = this;
    var a1 = Math.pow(10, len) * old;
    a1 = Math.round(a1);
    var oldstr = old.toString()
    var start = oldstr.indexOf(".");
    if (start > 0 && oldstr.split(".")[1].length == len + 1) {
        if (oldstr.substr(start + len + 1, 1) == 5) {
            var flagval = oldstr.substr(start + len, 1) - 0;
            if (flagval % 2 == 0) {
                a1 = a1 - 1;
            }
        }
    }
    var b1 = a1 / Math.pow(10, len);
    return b1;
}
Number.prototype.oldtoFixed = Number.prototype.toFixed;
Number.prototype.toFixed = function (len) {
    var old = this;
    var oldstr = old.toString()
    var start = oldstr.indexOf(".");
    if (len == 2 && start > 0 && oldstr.split(".")[1].length == 3) {
        return this.round(len);
    }
    else {
        return this.oldtoFixed(len);
    }
}

免责声明:文章转载自《Round() 四舍五入 js银行家算法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SDK更新如何在Web项目中给没有添加API核心组件添加APIController的帮助页HelpPage下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JS代码收藏大全

从其他地方找来的,希望对有需要的人带来方便! 1. oncontextmenu="window.event.returnvalue=false" 将彻底屏蔽鼠标右键<table border oncontextmenu=return(false)><td>no</table> 可用于Table 2. <body o...

JS案例之8——从一个数组中随机取数

近期项目中遇到一个需求,从一个列表中随机展示列表的部分内容,需求不大,JS也非常容易实现。主要是运用到了Math对象的random方法,和Array的splice方法。 思路是先新建一个数组,存放所有的列表,然后算出随机数,从数组中取出这个随机索引对应的值,然后组成一个随机数组。 源代码如下: 1 <!DOCTYPE html> 2 <...

Nginx 安装及配置、负载均衡https网站及转发后页面js、css等路径找不到问题、更换证书导致问题解决

官网下载nginx:http://nginx.org/en/download.html 安装nginx编译环境:yum install -y gcc-c++ 安装pcre库解析正则:yum install -y pcre pcre-devel 安装zlib库用于压缩解压缩:yum install -y zlib zlib-devel 安装openssl库...

js 递归获取子节点所有父节点,深度遍历获取第一个子树

前端需求。 递归 深度优先遍历算法 // 查找一个节点的所有父节点 familyTree (arr1, id) { var temp = [] var forFn = function (arr, id) { for (var i = 0; i < arr.length; i++) {...

使用css将网页变成黑白色

其实将整个网页全局变色,无非就是三种,css直接设置,添加svg滤镜,通过js遍历所有标签更改颜色,于是 1、css 直接编辑样式,然后在需要应用的地方设置class 1 .gray { 2 -webkit-filter: grayscale(100%); 3 -moz-filter: grayscale(100%); 4 -ms...

13个JavaScript图表(JS图表)图形绘制插件【转】

现在网络上又有越来越多的免费的(JS 图表)JavaScript图表图形绘制插件。我之前给一家网站做过复杂的图形,我们用的是 highchart。在那段时间,没有很多可供选择的插件。但现在不同了,很容易就可以找到很多功能非常不错的图表库。个人而言,此类插件的上升,是因为: 1. Flash 过去是最佳解决方案,但很多人多在从那迁移; 2. 现代浏览器及其更...