小学的时候学数学就知道有一种叫四舍五入的计算方式,就是对于小数位数的取舍,逢五进一,比如1.225 取两位小数后就是1.23。在前端开发中自己也少不了这样的计算,js也提供了相关的方法--toFixed(n) , 乍一看,还是非常方便的,既然有现成的那就顺序成章,‘肆无忌惮’用了,可是,用着用着就会发现,并没有那方便。因为经常会有你意想不到的问题。比如:1.005.toFixed(2) = 1.00,what? 不应该是1.01吗? 显然,这已经不是五入了,而是五舍了。这可怎么整呢?请看如下代码:

let Num = Number
Num.prototype.toFixed = function (d) {
let s = this + ''
if (!d) d = 0
if (s.indexOf('.') === -1) s += '.'
s += new Array(d + 1).join('0')
if (new RegExp('^(-|\\+)?(\\d+(\\.\\d{0,' + (d + 1) + '})?)\\d*$').test(s)) {
let ss = '0' + RegExp.$2
let pm = RegExp.$1
let a = RegExp.$3.length
let b = true
if (a === d + 2) {
a = ss.match(/\d/g)
if (parseInt(a[a.length - 1]) > 4) {
for (let i = a.length - 2; i >= 0; i--) {
a[i] = parseInt(a[i]) + 1
if (a[i] === 10) {
a[i] = 0
b = i !== 1
} else break
}
}
ss = a.join('').replace(new RegExp('(\\d+)(\\d{' + d + '})\\d$'), '$1.$2')
}
if (b) ss = ss.substr(1)
return (pm + ss).replace(/\.$/, '')
}
return this + ''
}

  因为toFixed() 方法可把 Number 四舍五入为指定小数位数的数字。例如将数据Num保留2位小数,则表示为:toFixed(Num);但是其四舍五入的规则与数学中的规则不同,使用的是银行家舍入规则,银行家舍入:所谓银行家舍入法,其实质是一种四舍六入五取偶(又称四舍六入五留双)法。具体规则如下:简单来说就是:四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一。

  经测试发现,在chorme下面,并没有完全遵守这个规则,尤其是5的后面没有数字的时候,不是这么判断的,如下:

var b = 1.335

b.toFixed(2)

"1.33"

var b = 1.345

b.toFixed(2)

"1.34"

var b = 1.355

b.toFixed(2)

"1.35"

var b = 1.365

b.toFixed(2)

"1.36"

var b = 1.375

b.toFixed(2)

"1.38"

var b = 1.385

b.toFixed(2)

"1.39"

js toFixed() 四舍五入后并不是你期望的结果的更多相关文章

  1. JS处理四舍五入函数 toFixed(n)(可取小数点后n位)

    在JS中四舍五入的函数 toFixed(n) , n为要保留的小数位数. n为0~20,当n超过20的时候,JS会出错. 如果小数点前和要截取的前一位都是0时,不会按常理截取.       var h ...

  2. JS的四舍五入问题

    最近踩了一个坑,mark一下toFixed四舍五入问题,详见代码: var myFixed = function(num, fix) { num = (parseFloat(num) * + ) / ...

  3. 为不同分辨率单独做样式文件,在页面头部用js判断分辨率后动态加载定义好的样式文件

    为不同分辨率单独做样式文件,在页面头部用js判断分辨率后动态加载定义好的样式文件.样式文件命名格式如:forms[_屏幕宽度].css,样式文件中只需重新定义文本框和下拉框的宽度即可. 在包含的头文件 ...

  4. js实现双击后网页自己主动跑-------Day55

    公司的界面设计环节总算是告一段落了,必需要承认的是,这段时间晚间的学习带给我非常多益处.在工作中偶尔的应用,效果出奇的好,收到领导和同事的一些小赞扬,表示非常欣慰,也长了点不少自信,尽管不理解,他们这 ...

  5. js MD5加密后的字符串

    js MD5加密后的字符串 <script language="JavaScript"> /************************************** ...

  6. 使用ajax上传图片,支持图片即时浏览,支持js图片压缩后上传给服务器

    使用ajax上传图片,支持图片即时浏览,支持js图片压缩后上传给服务器 ajax上传主要使用了 var reader = new FileReader() 此方法 js图片压缩主要是利用canvas进 ...

  7. 在js或css后加?v= 版本号不让浏览器缓存

    客户端会缓存css或js文件,改变版本号,客户端浏览器就会重新下载新的js或css文件,在js或css后加?v= 版本号的用法如下 代码如下: <span style="font-si ...

  8. 不阻塞浏览器的解析,待外部js下载完成后异步执行

    网站统计中的数据收集原理及实现(js埋点实现) - lastwhisper - CSDN博客 https://blog.csdn.net/l1212xiao/article/details/80450 ...

  9. 在Js或者cess后加版本号 防止浏览器缓存

    在Js或者cess后加版本号 防止浏览器缓存 客户端浏览器会缓存css或js文件,从而减少加载次数,减少流量,提高网页的访问速度.为了使得每次修改js或者css能生效,可以通过改变版本号来使得客户端浏 ...

随机推荐

  1. 10.12 csp-s模拟测试70 木板+打扫卫生+骆驼

    T1 木板 求$[\sqrt{n},n)$间有多少个数的平方是n的倍数 通过打表可以发现(我没带脑子我看不出来),符合条件的数构成一个等差数列,公差为首项 而首项就是将n质因数分解后每个质因数出现次数 ...

  2. [日常] 用vim的时候发现的不是很小的bug...

    前一天晚上的时候不知道搞啥了...第二天早上起来开 gnome-system-monitor 的时候发现CPU占用好像不太对头 (一直有个核是 \(100\%\)), 转到进程的时候发现使用最高的居然 ...

  3. JS中的undefined,null,"",0,'0'和false

    ){ console.log(); } '){ console.log() } '){ console.log() } if(false==0.0){ console.log() } if(false ...

  4. ubuntu18.04下安装无线网卡驱动心得

    联想Lenovo的笔记本,装完系统wifi显示找不到适配器. lspci | grep Wireless 显示无线网卡类型为博通的BCM43162. 网上一查,果然有问题. apt install f ...

  5. 解惑:如何使得寝室的电脑和实验室的电脑远程相互访问(Linux和Windows)

    解惑:如何使得寝室的电脑和实验室的电脑远程相互访问 一.前言 自从接触计算机网络之后就一直想着把实验室的电脑和自己寝室的电脑远程连接起来,结果总是郁郁不能成功,网上这样的教材也少的可怜,于是总是搁置下 ...

  6. (三十七)golang--如何获取命令行参数

    1.第一种方式 缺点:参数的接收受输入的顺序所影响. 2.第二种方式(使用flag包)  

  7. 《Web前端开发》等级考试样题~以国家“1+X”职业技能证书为标准,厚溥推出Web前端开发人才培养方案

    1+x证书Web前端开发初级理论考试样题2019 http://blog.zh66.club/index.php/archives/149/ 1+x证书Web前端开发初级实操考试样题2019 http ...

  8. IIS锁定是默认设置的 (overrideModeDefault="Deny")问题解决

    发布网站时提示错误 锁定是默认设置的 (overrideModeDefault="Deny"),或者是通过包含 overrideMode="Deny" 或旧有的 ...

  9. telnet 发送邮件

    telnet smtp.aliyun.com 25 // 这里用的是阿里云的smpt服务器,并且开放25端口 helo hi // 和阿里云的smtp服务器打招呼,测试是否连通 auth login ...

  10. virt-install命令---详解

    virt-install命令 一般选项:指定虚拟机的名称.内存大小.VCPU个数及特性等: -n NAME, --name=NAME:虚拟机名称,需全局惟一: -r MEMORY, --ram=MEM ...