博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Round() 四舍五入 js银行家算法
阅读量:6705 次
发布时间:2019-06-25

本文共 1982 字,大约阅读时间需要 6 分钟。

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

首先SQL server 返回的是 0.83

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

      

这里并不是我们期望的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)

网上有人说 这个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);    }}

 

转载地址:http://ijflo.baihongyu.com/

你可能感兴趣的文章
Day2----Python学习之路笔记(2)
查看>>
在mac os x 下升级emacs
查看>>
HDU2010 水仙花数【进制+趣味程序】
查看>>
1593: [Usaco2008 Feb]Hotel 旅馆
查看>>
dubbo的本地存根(Stub)
查看>>
转://Linux下误删除/home目录的恢复方法
查看>>
HDFS详解
查看>>
2-Add Two Numbers
查看>>
ORACLE学习-3.多表查询
查看>>
app性能测试
查看>>
Oracle Parallel Execution(并行执行)
查看>>
生产者和消费者案例
查看>>
分辨率判断
查看>>
POJ - 1160 Post Office
查看>>
python和shell变量互相传递
查看>>
二叉搜索树转换为有序双向链表
查看>>
jQuery选择器大全
查看>>
在计算机 . 上没有找到服务 WAS
查看>>
JAVA-基础(三大特性)
查看>>
[BZOJ] 1563: [NOI2009]诗人小G
查看>>