直接使用时,变量是不同的

时间:2012-09-17 10:59:29

标签: javascript floating-point

Google Chrome的Javascript引擎对此原型中的变量值做了一些奇怪的事情。

原型定义为:

function matrix4def()
{
 this.m00=0;
 this.m01=0;
 this.m02=0;
 this.m03=0;
 this.m10=0;
 this.m11=0;
 this.m12=0;
 this.m13=0;
 this.m20=0;
 this.m21=0;
 this.m22=0;
 this.m23=0;
 this.m30=0;
 this.m31=0;
 this.m32=0;
 this.m33=0;
};

var value = new matrix4def();

console.log(value)告诉我们:

 m00: 1
 m01: 0
 m02: 0
 m03: 0
 m10: 0
 m11: 1
 m12: 0
 m13: 0
 m20: 0
 m21: 0
 m22: 1
 m23: 0
 m30: 0
 m31: 0
 m32: 0
 m33: 1

使用console.log(value.m00)时会向我们显示:-6.123031769111886e-17。 执行console.log(value); console.log(value.m00); console.log(value);时,console.log(value);的第一次和第二次调用之间没有区别。

执行console.log(typeof(value.m00))会向我们显示:number

我已经尝试过parseFloat(value.m00),但这也没有显示1 ... 将value.m00的值存储到临时值也会显示-6.123031769111886e-17

有没有人知道这里发生了什么?

P.S。:我无法向您展示整个代码;它是渲染代码的一部分,可以很好地利用这些值。

2 个答案:

答案 0 :(得分:2)

这看起来像是console.log的一个问题,它会显示对象的当前属性值,而不是记录对象时的属性值。在更改值的日志记录周围(之后)是否有任何代码?

console.log(new matrix4def().m00)

记录0,而不是非常接近零的负面信息。

答案 1 :(得分:0)

我怀疑您在运行完整脚本时遇到此问题(或者至少:在对对象的属性执行某些操作之后)。并且,鉴于您正在使用parseFloat,我假设值可以是十进制(浮点)值。
如果是这种情况,你应该仔细研究JS和浮点数的已知问题:

either here
or here
maybe here, too
and last but not least: here

不要忘记查看最后一页提到的文章