设为首页
优惠IDC
收藏本站
六狼博客
六狼论坛
开启辅助访问
切换到窄版
用户名
Email
自动登录
找回密码
密码
登录
立即注册
只需一步,快速开始
只需一步,快速开始
快捷导航
门户
首页
BBS
云计算
大数据
手机
移动开发android,ios,windows phone,windows mobile
编程
编程技术java,php,python,delphi,ruby,c,c++
前端
WEB前端htmlcss,javascript,jquery,html5
数据库
数据库开发Access,mysql,oracle,sql server,MongoDB
系统
操作系统windows,linux,unix,os,RedHat,tomcat
架构
项目管理
软件设计,架构设计,面向对象,设计模式,项目管理
企业
服务
运维实战
神马
搜索
搜索
热搜:
php
java
python
ruby
hadoop
sphinx
solr
ios
android
windows
centos
本版
帖子
用户
六狼论坛
»
首页
›
WEB前端
›
JavaScript
›
JS中toFixed()方法的问题及解决方案
返回列表
查看:
19
|
回复:
0
JS中toFixed()方法的问题及解决方案
[复制链接]
谷神出幕
谷神出幕
当前离线
积分
28
窥视卡
雷达卡
升级
56%
当前用户组为
童生
当前积分为
28
, 升到下一级还需要 22 点。
8
主题
8
主题
8
主题
童生
童生, 积分 28, 距离下一级还需 22 积分
童生, 积分 28, 距离下一级还需 22 积分
积分
28
发消息
楼主
|
发表于 2012-12-22 21:29:29
|
显示全部楼层
|
阅读模式
JS中toFixed()方法的问题及解决方案
<div id="cnblogs_post_body">最近发现JS当中toFixed()方法存在一些问题,采用原生的Number对象的原型对象上的toFixed()方法时,规则并不是所谓的&ldquo;四舍五入&rdquo;或者是&ldquo;四舍六入五成双&rdquo;,所谓&ldquo;四舍六入五成双&rdquo;,在百度百科上给的解释是:也即&ldquo;4舍6入5凑偶&rdquo;这里&ldquo;四&rdquo;是指&le;4 时舍去,"六"是指&ge;6时进上,"五"指的是根据5后面的数字来定,当5后有数时,舍5入1;当5后无有效数字时,需要分两种情况来讲:①5前为奇数,舍5入1;②5前为偶数,舍5不进。(0是最小的偶数) 。百度百科上涉及的几个例子在实际情况下确实成立,但不科学,并不能覆盖所有的情况。
测试浏览器:屌丝浏览器IE6以及高级屌丝浏览器IE78和所有现代主流浏览器包括IE9、IE10、FF、chrome、opera、safari。(注:在使用IE10的类似firebug的开发工具时,采用兼容IE低版本浏览器模式时的测试结果跟使用原生低版本IE浏览器的测试结果不一致)
在浮点数末尾&le;4或者&ge;6的情况下的舍入没有争议,但当末尾正好等于5的情况下可谓混乱之极。
一、FF 稳定版测试结果如下所示:
二、FF Aurora测试结果如下所示:
三、FF Nightly的测试结果如下所示:
四、Chrome稳定版的测试结果如下所示:
五、Chromium的测试结果如下所示:
六、Chrome Canary的测试结果如下所示:
七、Opera稳定版的测试结果如下所示:
八、Opera Next的测试结果如下所示:
九、Safari的测试结果如下所示:
十、IE6-8的测试结果如下所示:
十一、IE9、10的测试结果如下所示:
总结:众所周知,遵循IEEE754数值格式的语言的浮点计算会出现精度损耗的通病,ES也并非独此一家,因此尽量不要进行某个特定浮点数值的测试,如:0.1+0.2;
解决方案:重写Number.prototype.toFixed()方法:
<div class="cnblogs_code" >
View Code <div id="cnblogs_code_open_d43d697c-bf5e-43f3-983b-29fbe48d377e" class="cnblogs_code_hide">
1
<
html
>
2
<
head
>
3
<
script
type
="text/javascript"
>
4
Number.prototype.toFixed
=
function
(d) {
5
var
s
=
this
+
""
;
6
if
(
!
d)d
=
0
;
7
if
(s.indexOf(
"
.
"
)
==-
1
)s
+=
"
.
"
;
8
s
+=
new
Array(d
+
1
).join(
"
0
"
);
9
if
(
new
RegExp(
"
^(-|\\+)?(\\d+(\\.\\d{0,
"
+
(d
+
1
)
+
"
})?)\\d*$
"
).test(s)){
10
var
s
=
"
0
"
+
RegExp.$
2
,pm
=
RegExp.$
1
,a
=
RegExp.$
3
.length,b
=
true
;
11
if
(a
==
d
+
2
){
12
a
=
s.match(
/
\d
/
g);
13
if
(parseInt(a[a.length
-
1
])
>
4
){
14
for
(
var
i
=
a.length
-
2
;i
>=
0
;i
--
){
15
a
=
parseInt(a
)
+
1
;
16
if
(a
==
10
){
17
a
=
0
;
18
b
=
i
!=
1
;
19
}
else
break
;
20
}
21
}
22
s
=
a.join(
""
).replace(
new
RegExp(
"
(\\d+)(\\d{
"
+
d
+
"
})\\d$
"
),
"
$1.$2
"
);
23
24
}
if
(b)s
=
s.substr(
1
);
25
return
(pm
+
s).replace(
/
\.$
/
,
""
);
26
}
return
this
+
""
;
27
28
};
29
</
script
>
30
</
head
>
31
<
body
>
32
<
input
type
="button"
value
="显示0.009.toFixed(2)"
onclick
="alert(0.009.toFixed(2))"
><
br
/>
33
<
input
type
="button"
value
="显示0.123.toFixed(2)"
onclick
="alert(0.123.toFixed(2))"
><
br
/>
34
<
input
type
="button"
value
="显示0.125.toFixed(2)"
onclick
="alert(0.125.toFixed(2))"
><
br
/>
35
<
input
type
="button"
value
="显示0.126.toFixed(2)"
onclick
="alert(0.126.toFixed(2))"
><
br
/>
36
<
input
type
="button"
value
="显示20.445.toFixed(2)"
onclick
="alert(20.445.toFixed(2))"
><
br
/>
37
<
input
onclick
="alert(20.405.toFixed(2))"
type
="button"
value
="显示20.405.toFixed(2)"
>
<
br
/>
38
<
input
onclick
="alert(20.415.toFixed(2))"
type
="button"
value
="显示20.415.toFixed(2)"
>
<
br
/>
39
<
input
onclick
="alert(20.425.toFixed(2))"
type
="button"
value
="显示20.425.toFixed(2)"
>
<
br
/>
40
<
input
onclick
="alert(20.435.toFixed(2))"
type
="button"
value
="显示20.435.toFixed(2)"
>
<
br
/>
41
<
input
onclick
="alert(20.445.toFixed(2))"
type
="button"
value
="显示20.445.toFixed(2)"
>
<
br
/>
42
<
input
onclick
="alert(20.455.toFixed(2))"
type
="button"
value
="显示20.455.toFixed(2)"
>
<
br
/>
43
<
input
onclick
="alert(20.465.toFixed(2))"
type
="button"
value
="显示20.465.toFixed(2)"
>
<
br
/>
44
<
input
onclick
="alert(20.475.toFixed(2))"
type
="button"
value
="显示20.475.toFixed(2)"
>
<
br
/>
45
<
input
onclick
="alert(20.485.toFixed(2))"
type
="button"
value
="显示20.485.toFixed(2)"
>
<
br
/>
46
<
input
onclick
="alert(20.495.toFixed(2))"
type
="button"
value
="显示20.495.toFixed(2)"
>
<
br
/>
47
<
input
onclick
="alert(0.05.toFixed(1))"
type
="button"
value
="显示0.05.toFixed(1)"
>
<
br
/>
48
<
input
onclick
="alert(0.15.toFixed(1))"
type
="button"
value
="显示0.15.toFixed(1)"
>
<
br
/>
49
<
input
onclick
="alert(0.25.toFixed(1))"
type
="button"
value
="显示0.25.toFixed(1)"
>
<
br
/>
50
<
input
onclick
="alert(0.35.toFixed(1))"
type
="button"
value
="显示0.35.toFixed(1)"
>
<
br
/>
51
<
input
onclick
="alert(0.45.toFixed(1))"
type
="button"
value
="显示0.45.toFixed(1)"
>
<
br
/>
52
<
input
onclick
="alert(0.55.toFixed(1))"
type
="button"
value
="显示0.55.toFixed(1)"
>
<
br
/>
53
<
input
onclick
="alert(0.65.toFixed(1))"
type
="button"
value
="显示0.65.toFixed(1)"
>
<
br
/>
54
<
input
onclick
="alert(0.75.toFixed(1))"
type
="button"
value
="显示0.75.toFixed(1)"
>
<
br
/>
55
<
input
onclick
="alert(0.85.toFixed(1))"
type
="button"
value
="显示0.85.toFixed(1)"
>
<
br
/>
56
<
input
onclick
="alert(0.95.toFixed(1))"
type
="button"
value
="显示0.95.toFixed(1)"
>
<
br
/>
57
</
body
>
58
</
html
>
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
显身卡
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
Copyright © 2008-2020
六狼论坛
(http://it.6wolf.com) 版权所有 All Rights Reserved.
Powered by
Discuz!
X3.4
京ICP备14020293号-2
本网站内容均收集于互联网,如有问题请联系
QQ:389897944
予以删除
快速回复
返回顶部
返回列表