js 计算问题

马老虎 2009-04-22 05:17:16
<HTML>
<HEAD>
<script>
function doi()
{
var i = document.getElementById("aaa").value;
/// var i =53643.1;
alert((i/10000));
}

</script>
</HEAD>

<BODY onload="doi();">
<input id="aaa" type="text" value="1223840.94"/>
</BODY>
</HTML>

弹出框的值 有问题!
假如 把 value="1223840.94" 改成 带一位小数的 就没问题!
用parseFloat还是不行
如果改成 alert(i*1000/10000000); 就没问题了!


什么原因啊??
...全文
280 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
马老虎 2009-04-23
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 skycc999 的回复:]
这个应该是js的一个bug,网上有一些针对这种情况写的专用算法,楼主可以搜一下。
另外,如果想得到制定精度的数值,可以这样用:
如果要保留三位则:Math.round(rs*1000)/1000;
如果要保留四位则:Math.round(rs*10000)/10000;.....以次类推
[/Quote]

<script>
//除法函数,用来得到精确的除法结果
//说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
//调用:accDiv(arg1,arg2)
//返回值:arg1除以arg2的精确结果
function accDiv(arg1,arg2){
var t1=0,t2=0,r1,r2;
try{t1=arg1.toString().split(".")[1].length}catch(e){}
try{t2=arg2.toString().split(".")[1].length}catch(e){}
with(Math){
r1=Number(arg1.toString().replace(".",""))
r2=Number(arg2.toString().replace(".",""))
return (r1/r2)*pow(10,t2-t1);
}
}

//给Number类型增加一个div方法,调用起来更加方便。
Number.prototype.div = function (arg){
return accDiv(this, arg);
}

function doi()
{
alert(accDiv(678.123,1000));
}
</script>

上面是跟网上搜到的浮点除法计算!但是还是解决不了我的问题!
如果将红色的1000改成10000 就有是那种误差的结果。难道对于10000 JS 不会算了?
马老虎 2009-04-23
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 skycc999 的回复:]
这个应该是js的一个bug,网上有一些针对这种情况写的专用算法,楼主可以搜一下。
另外,如果想得到制定精度的数值,可以这样用:
如果要保留三位则:Math.round(rs*1000)/1000;
如果要保留四位则:Math.round(rs*10000)/10000;.....以次类推
[/Quote]
如果无法确定是 结果要几位小数呢?也就是说该几位就是几位!
skycc999 2009-04-23
  • 打赏
  • 举报
回复
这个应该是js的一个bug,网上有一些针对这种情况写的专用算法,楼主可以搜一下。
另外,如果想得到制定精度的数值,可以这样用:
如果要保留三位则:Math.round(rs*1000)/1000;
如果要保留四位则:Math.round(rs*10000)/10000;.....以次类推
taofan911 2009-04-23
  • 打赏
  • 举报
回复
浮点运算可能导致舍入误差,产生的结果接近 — 但不等于 — 您可能希望的结果。例如,
下面这个简单的计算将得到 2.000000000000004,而不是 2.0:
var s=0;
for (var i=0; i<20; i++)
s += 0.1
alert(s);
类似的,0.1*26 相乘所产生的结果不等于 0.1 自身加 26 次所得到的结果。
当将浮点数转换成整数时,产生的舍入误差甚至更严重,甚至对于那些”看上去似乎“应该得到整数值的计算,也存在此类问题。例如,下面这些语句:
var d = 29.0 * 0.01;
alert(d);
alert(d * 100);
将得到以下输出:
0.29
28.999999999999996








  这可能不是您起初所期望的。
sjkof 2009-04-23
  • 打赏
  • 举报
回复
float和double就是有误差的,js和java都是如此
Daly罗 2009-04-23
  • 打赏
  • 举报
回复
还有一种解释,比如java语言无法精确的表示0.1,所以只能用0.099998来取代.我认为jsp中也一样!
Daly罗 2009-04-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 mmm306306 的帖子:]
<HTML>
<HEAD>
<script>
function doi()
{
var i = document.getElementById("aaa").value;
/// var i =53643.1;
alert((i/10000));
}

</script>
</HEAD>

<BODY onload="doi();">
<input id="aaa" type="text" value="1223840.94"/>
</BODY>
</HTML>

弹出框的值 有问题!
假如 把 value="1223840.94" 改成 带一位小数的 就没问题
用parseFloat还是不行
如果…
[/Quote]

这是关于精度的问题,当改成带一位小数时,value是float型,结果而如果是两位小数则为double型,问题就出在如果表达中有一个
double类型,结果就会用Double类型表示,除以10000结果:1.1456979999999998就属于这种情况.
马老虎 2009-04-23
  • 打赏
  • 举报
回复
没人给个说法?
奇怪!
马老虎 2009-04-23
  • 打赏
  • 举报
回复
我想要的结果是
除以10000结果:1.145698

不明白是:浮点数的运算有bug,为什么除以1000结果正常。
而除以10000就不正常了?

我跟网上也找到了 解决方法,但是不明白为什么计算不正常?
马老虎 2009-04-23
  • 打赏
  • 举报
回复

<script>
function doi()
{
var i = 11456.98
document.write("除以1000结果:"+i/1000);
document.write("<br />");
document.write("除以10000结果:"+i/10000);
}

</script>

结果是如下:
除以1000结果:11.45698
除以10000结果:1.1456979999999998

请高手们说说原因!
oklinsong 2009-04-23
  • 打赏
  • 举报
回复
楼主想要什么样的结果?
马老虎 2009-04-23
  • 打赏
  • 举报
回复
请楼上的同志运行一下看看!
马老虎 2009-04-23
  • 打赏
  • 举报
回复
晕!没人回应!
GeekZFZ 2009-04-23
  • 打赏
  • 举报
回复
学习了
suwanjun881011 2009-04-22
  • 打赏
  • 举报
回复
加个if就可以了啊!
pubaolin 2009-04-22
  • 打赏
  • 举报
回复
有什么问题?因为是符点型,这个值是对的,有误差
w06q02 2009-04-22
  • 打赏
  • 举报
回复
四舍五入给转换掉的吧。。

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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