为什么js的四舍五入方法,当数据超过16位的时候就会不对

小_虎 2010-01-06 01:30:00
function NumRound(a_Num, a_Bit) {
//alert(a_Num + "\n" + Math.pow(10, a_Bit) + "\n" + a_Num * Math.pow(10, a_Bit))
return ((Math.round(a_Num * Math.pow(10, a_Bit)) / Math.pow(10, a_Bit)).toFixed(a_Bit));
}


我发现用NumRound(99999999999999999,2)
测试的时候就不对。
大家可以把函数内的alert不注释,让他弹习试试。

或者说是不是js只能在一定范围内进行这个转换。?
...全文
595 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
小_虎 2011-07-21
  • 打赏
  • 举报
回复
=><script>alert('dfafa')</script>
小_虎 2010-01-06
  • 打赏
  • 举报
回复
不好意思,结贴失误
小_虎 2010-01-06
  • 打赏
  • 举报
回复
小虎膜拜楼上的大虎
yixianggao 2010-01-06
  • 打赏
  • 举报
回复
经过试验发现,俺机器上的 js 数字精度如下:

纯整数,即没有小数部分,最多显示 15 个 9;
纯小数,即整数部分为0,最多显示 16 个 9;
普通小数,整数、小数部分都有且非零,
精度为(16, F),16 为整数部分与小数部分位数之和,F 为小数部分位数!

这只是显示,并不保证此精度内的计算就是准确的,
因为运算中会有无限循环小数,也会发生精度丢失的问题!
licip 2010-01-06
  • 打赏
  • 举报
回复
学习了。
yixianggao 2010-01-06
  • 打赏
  • 举报
回复
纯小数位 16 位以后废了!

L@_@K
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title> new document </title>
<meta name="generator" content="editplus" />
<meta name="author" content="" />
<meta name="keywords" content="" />
<meta name="description" content="" />
</head>

<body>

<script language="javascript" type="text/javascript">
function NumRound(a_Num, a_Bit) {
//alert(a_Num + "\n" + Math.pow(10, a_Bit) + "\n" + a_Num * Math.pow(10, a_Bit))
return ((Math.round(a_Num * Math.pow(10, a_Bit)) / Math.pow(10, a_Bit)).toFixed(a_Bit));
}

//var numStr = "";
var numStr = "0.";
var charNine = "9";
var maxLength = 20;
for (var i=1; i<=maxLength; i++)
{
numStr += charNine;
//document.write(i, ": Str: ", numStr, " Num: ",parseInt(numStr), "<br />");
document.write(i, ": Str: ", numStr, " Num: ",parseFloat(numStr), "<br />");
}

/*
Int
1: Str: 9 Num: 9
2: Str: 99 Num: 99
3: Str: 999 Num: 999
4: Str: 9999 Num: 9999
5: Str: 99999 Num: 99999
6: Str: 999999 Num: 999999
7: Str: 9999999 Num: 9999999
8: Str: 99999999 Num: 99999999
9: Str: 999999999 Num: 999999999
10: Str: 9999999999 Num: 9999999999
11: Str: 99999999999 Num: 99999999999
12: Str: 999999999999 Num: 999999999999
13: Str: 9999999999999 Num: 9999999999999
14: Str: 99999999999999 Num: 99999999999999
15: Str: 999999999999999 Num: 999999999999999
16: Str: 9999999999999999 Num: 10000000000000000
17: Str: 99999999999999999 Num: 100000000000000000
18: Str: 999999999999999999 Num: 1000000000000000000
19: Str: 9999999999999999999 Num: 10000000000000000000
20: Str: 99999999999999999999 Num: 100000000000000000000

Float
1: Str: 0.9 Num: 0.9
2: Str: 0.99 Num: 0.99
3: Str: 0.999 Num: 0.999
4: Str: 0.9999 Num: 0.9999
5: Str: 0.99999 Num: 0.99999
6: Str: 0.999999 Num: 0.999999
7: Str: 0.9999999 Num: 0.9999999
8: Str: 0.99999999 Num: 0.99999999
9: Str: 0.999999999 Num: 0.999999999
10: Str: 0.9999999999 Num: 0.9999999999
11: Str: 0.99999999999 Num: 0.99999999999
12: Str: 0.999999999999 Num: 0.999999999999
13: Str: 0.9999999999999 Num: 0.9999999999999
14: Str: 0.99999999999999 Num: 0.99999999999999
15: Str: 0.999999999999999 Num: 0.999999999999999
16: Str: 0.9999999999999999 Num: 0.9999999999999999
17: Str: 0.99999999999999999 Num: 1
18: Str: 0.999999999999999999 Num: 1
19: Str: 0.9999999999999999999 Num: 1
20: Str: 0.99999999999999999999 Num: 1
*/
</script>

</body>
</html>
yixianggao 2010-01-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jxyxhz 的回复:]
顶。
[/Quote]
做个试验就都清楚了,整数位15位以后就废了!

L@_@K
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title> new document </title>
<meta name="generator" content="editplus" />
<meta name="author" content="" />
<meta name="keywords" content="" />
<meta name="description" content="" />
</head>

<body>

<script language="javascript" type="text/javascript">
var numStr = "";
var charNine = "9";
var maxLength = 20;
for (var i=1; i<=maxLength; i++)
{
numStr += charNine;
document.write(i, ": Str: ", numStr, " Num: ",parseInt(numStr), "<br />");
}

/*
1: Str: 9 Num: 9
2: Str: 99 Num: 99
3: Str: 999 Num: 999
4: Str: 9999 Num: 9999
5: Str: 99999 Num: 99999
6: Str: 999999 Num: 999999
7: Str: 9999999 Num: 9999999
8: Str: 99999999 Num: 99999999
9: Str: 999999999 Num: 999999999
10: Str: 9999999999 Num: 9999999999
11: Str: 99999999999 Num: 99999999999
12: Str: 999999999999 Num: 999999999999
13: Str: 9999999999999 Num: 9999999999999
14: Str: 99999999999999 Num: 99999999999999
15: Str: 999999999999999 Num: 999999999999999
16: Str: 9999999999999999 Num: 10000000000000000
17: Str: 99999999999999999 Num: 100000000000000000
18: Str: 999999999999999999 Num: 1000000000000000000
19: Str: 9999999999999999999 Num: 10000000000000000000
20: Str: 99999999999999999999 Num: 100000000000000000000
*/
</script>

</body>
</html>
小_虎 2010-01-06
  • 打赏
  • 举报
回复
好,楼下的没分了,楼上的人人有分
Ny-6000 2010-01-06
  • 打赏
  • 举报
回复
真厉害!

哥们,请不要恶意灌水
hehuan1213 2010-01-06
  • 打赏
  • 举报
回复
js 最初设计就不是用于高精计算的,100 以内的四则运算还凑合,
sohighthesky 2010-01-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jxyxhz 的回复:]
顶。
[/Quote]
不用顶了,ls已经说了,js不适合做高精度运算,
小_虎 2010-01-06
  • 打赏
  • 举报
回复
顶。
sohighthesky 2010-01-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 junjun1984 的回复:]
超过精度了。
[/Quote]
这什么版?
yixianggao 2010-01-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jxyxhz 的回复:]
有什么方法没?
[/Quote]
js 最初设计就不是用于高精计算的,100 以内的四则运算还凑合,
太大太小都会丢精度,只能发回服务器运算!

当然,有些情况可以考虑用正则处理!
yixianggao 2010-01-06
  • 打赏
  • 举报
回复
js 数值精度问题,js 不适于做高精计算,
高精度计算还是在 Server 端执行吧!
小_虎 2010-01-06
  • 打赏
  • 举报
回复
有什么方法没?
junjun1984 2010-01-06
  • 打赏
  • 举报
回复
超过精度了。

87,901

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧