JAVASCRIPT的取整问题.

xiaobeibei 2002-09-30 11:40:47
alert(1-0.2111);这条语句执行的结果是:0.7889999999....
这显然是不对的.我IE的版本是5.0
我的问题有下面几个,回答一个或几个者都给分.

1 加,减,乘,除都会遇到这样的情况吗? 能告诉原因吗?

2 怎么样避免这种情况.因为涉及的运算公式很多.最后能给一个适用于复杂运算都可以
用的函数.

分数不够我再加.
...全文
78 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
alexxing 2002-10-01
  • 打赏
  • 举报
回复
嗨,上面还有问题(拨号上网,太匆忙,不好意思):
N=0 => 0.2
N=1 => 0.21
...
N=3 => 0.2111

改成

function roundToN(x, N)
{
var K = 1;
for ( var i = 0; i < N; i ++ )
K *= 10; // K = 10^N
x *= K; // 放大 K 倍
x = Math.round(x); // 整数圆整
return x / K; // 缩小 K 倍
}

var x = roundToN(1 - 0.2111, 4);
var s = "" + x;

N 的定义:
N=1 => 0.2
N=2 => 0.21
...
N=4 => 0.2111
alexxing 2002-10-01
  • 打赏
  • 举报
回复
忘了加参数:

function roundToN(x, N)
{
var K = 10;
for ( var i = 0; i < N; i ++ )
K *= 10; // K = 10^N
x *= K; // 放大 K 倍
x = Math.round(x); // 整数圆整
return x / K; // 缩小 K 倍
}

var x = roundToN(1 - 0.2111, 4);
var s = "" + x;
alexxing 2002-10-01
  • 打赏
  • 举报
回复
我执行的结果是
0.78889999999,不是
0.7889999999!(少了一个 8)

1-0.2111 = 0.7889
因此 0.78889999999 是很精确的了,只是对于人类,显得很“难看”


如果想“系统地”解决这个问题,又不能用 toFixed,不妨写个通用的 roundToN() 函数,
将浮点数圆整到小数点后 N 位,以“掩盖”计算误差:

function roundToN(x)
{
var K = 10;
for ( var i = 0; i < N; i ++ ) K *= 10;
x *= K;
x = Math.round(x);
return x / K;
}

var x = roundToN(1 - 0.2111);
var s = "" + x;
孟子E章 2002-09-30
  • 打赏
  • 举报
回复
浮点数的运算会有这个问题。有js的实现机制有关系。
xiaobeibei 2002-09-30
  • 打赏
  • 举报
回复
谁能告诉我什么情况下会发生这样的问题?
另祝JAVASCRIPT论坛的各位中秋节快乐!!!
xiaobeibei 2002-09-30
  • 打赏
  • 举报
回复
孟子,我要是这么用你的函数tofloat(1-0.2111,4)
是不是在0.7889999999...的基础上取整数的.
那样会不会出现数据精度丢失的情况.(代码有些地方还看不懂)
xiaobeibei 2002-09-30
  • 打赏
  • 举报
回复
toFixed在IE5.0下是不能使用的.
孟子.能不能告诉我在什么情况下会出现这样的问题.
我没有必要把所有的运算都套上你的函数吧?
孟子E章 2002-09-30
  • 打赏
  • 举报
回复
关于转换小数位数,参见:

<script language=JavaScript>
function tofloat(f,dec) {
if(dec<0) return "Error:dec<0!";
result=parseInt(f)+(dec==0?"":".");
f-=parseInt(f);
if(f==0)
for(i=0;i<dec;i++) result+='0';
else {
for(i=0;i<dec;i++) f*=10;
result+=parseInt(Math.round(f));
}
return result;
}
alert(tofloat(11.20000000000000000001,5))
</script>
孟子E章 2002-09-30
  • 打赏
  • 举报
回复
先转换成整数再进行运算,
bencalie 2002-09-30
  • 打赏
  • 举报
回复
<script>
alert((1-0.2111).toFixed(4));
</script>
qiushuiwuhen 2002-09-30
  • 打赏
  • 举报
回复
具体问题具体分析,上面简写为
a(s(1,d(s(l_a,l_b),l_a)),s(d,f))
只要写好函数a() s() d() m()
xiaobeibei 2002-09-30
  • 打赏
  • 举报
回复
qiuliang1979(qiuliang)
运算的时候不知道小数点后面会有几位的.
1和0.2111只是我举的一个例子.
net_lover(孟子E章) && qiushuiwuhen(秋水无恨)
是不是说加减乘除都有可能碰到这样的问题,
那样就惨了
比如下面的公式,每次运算都要调用一次,那不累死了.
(1-(eval(l_a)-eval(l_b))/eval(l_a)) + (eval(d) - eval(f)) +...


qiuliang1979 2002-09-30
  • 打赏
  • 举报
回复
最简单的方法:同时将1和0.2111放大1000相减后在将结果缩小1000倍就OK了!

1000-211.1=788.9
788.9/1000=0.7889
qiushuiwuhen 2002-09-30
  • 打赏
  • 举报
回复
<script>
alert(qswhAdd(1,-0.2111))
function qswhAdd(n1,n2){
var r1,r2,m;
try{r1=n1.toString().split(".")[1].length}catch(e){r1=0}
try{r2=n2.toString().split(".")[1].length}catch(e){r2=0}
m=Math.pow(10,Math.max(r1,r2))
return (n1*m+n2*m)/m
}
</script>

87,904

社区成员

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

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