2011-12-01 33 views
2

我一直在玩Script#,我想知道C#数字如何转换为Javascript。我写的代码脚本#号码如何映射到Javascript?

int a = 3/2; 

这一点,看着编译的JavaScript的相关位:

var $0=3/2; 

在C#中,分配给int3/2结果是1,但在Javascript中,这只有一个数字类型,是1.5。由于C#和Javascript行为之间的这种不一致,并且由于编译后的代码似乎无法弥补它,所以我应该假设在编译为Javascript时,用C#编写的数值计算可能表现不正确?

回答

4

我应该假设用C#编写的数值计算可能在编译为Javascript时表现不正确?

是的。

像你说的,“编译后的代码似乎并没有对其进行补偿” - 尽管对于情况下,你是在哪里a被宣布为int这将是很容易通过使用var $0 = Math.floor(3/2);进行补偿。但是,如果你不控制“编译器”的工作方式,你就会陷入困境。 (您可以手动更正JavaScript,但是每次重新生成时都必须这样做,Yuck)

请注意,由于JavaScript代表小数位的方式,您可能也会遇到十进制数问题。当大多数人第一次发现JavaScript会告诉你0.4 * 3 works out to be 1.2000000000000002时,大多数人都很惊讶。有关更多详细信息,请参阅有关此问题的其他许多问题之一,例如How to deal with floating point number precision in JavaScript?。 (其实我认为C#以相同的方式处理小数点,所以也许这个问题不会是这样的惊喜,但它可能是新玩家的陷阱......)

+1

JavaScript中的所有数字在C#中实际上是双打的没有int/float/long/decimal等价物)。这包括数学运算符,如上所述(所有运算符都在双打上有效完成)。我认为两者都被定义为按照[IEEE754-binary64/FP64(或“double”)](http://en.wikipedia.org/wiki/Double-precision_floating-point_format)工作(尽管可能出现跨体系结构的细微差异在边缘情况下:考虑x86有一个80位内部FPU)。 – 2011-12-01 04:53:29

+0

@pst - 感谢您的额外信息。在我记起C#如何处理小数之前,我开始输入最后一段,但后来我想我会把它留在我的回答中,因为很多JavaScript程序员都没有意识到这种行为(因此最终的括号声明)。 – nnnnnn