2011-12-01 34 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