我执行的结果是 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;
忘了加参数: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;
嗨,上面还有问题(拨号上网,太匆忙,不好意思): 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
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>
孟子.能不能告诉我在什么情况下会出现这样的问题.
我没有必要把所有的运算都套上你的函数吧?
是不是在0.7889999999...的基础上取整数的.
那样会不会出现数据精度丢失的情况.(代码有些地方还看不懂)
另祝JAVASCRIPT论坛的各位中秋节快乐!!!
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>
运算的时候不知道小数点后面会有几位的.
1和0.2111只是我举的一个例子.
net_lover(孟子E章) && qiushuiwuhen(秋水无恨)
是不是说加减乘除都有可能碰到这样的问题,
那样就惨了
比如下面的公式,每次运算都要调用一次,那不累死了.
(1-(eval(l_a)-eval(l_b))/eval(l_a)) + (eval(d) - eval(f)) +...
a(s(1,d(s(l_a,l_b),l_a)),s(d,f))
只要写好函数a() s() d() m()
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;
{
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;
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