語法:
MultiplicativeExpression : UnaryExpression MultiplicativeExpression * UnaryExpression MultiplicativeExpression / UnaryExpression MultiplicativeExpression % UnaryExpression
語義:
產(chǎn)生式 MultiplicativeExpression : 'MultiplicativeExpression'@ 'UnaryExpression, 其中 @ 表示上面定義中的運算符之一,按照下面的過程執(zhí)行 :
- 令 left 為解釋執(zhí)行 MultiplicativeExpression 的結(jié)果 .
- 令 leftValue 為 GetValue(left).
- 令 right 為解釋執(zhí)行 UnaryExpression 的結(jié)果 .
- 令 rightValue 為 GetValue(right).
- 令 leftNum 為 ToNumber(leftValue).
- 令 rightNum 為 ToNumber(rightValue).
- 返回將特定運算符 (*, /, or %) 作用于 leftNum 和 rightNum 的結(jié)果。參見 11.5.1, 11.5.2, 11.5.3 后的注解。
使用 * 運算符
*運算符表示乘法,產(chǎn)生操作數(shù)的乘積。乘法運算滿足交換律。因為精度問題,乘法不總是滿足結(jié)合律。
浮點數(shù)的乘法遵循IEEE 754二進制雙精度幅度浮點算法規(guī)則:
- 若兩個操作數(shù)之一為NaN,結(jié)果為NaN。
- 假如兩個操作數(shù)的正負號相同,結(jié)果就是正的,如果不同就是負的。
- 無窮大被零乘結(jié)果是NaN。
- 無窮大被無窮大乘結(jié)果就是無窮大。符號按照前面說過的規(guī)則決定。
- 無窮大被有窮的非零值乘結(jié)果是帶正負號的無窮大。符號仍然按照前面說過的規(guī)則決定。
- 其它情況下,既沒有無窮大也沒有NaN參與運算,結(jié)果計算出來后會按照IEEE 754 round-to-nearest模式取到最接近的能表示的數(shù)。如果值過大不能表示,則結(jié)果為相應(yīng)的正負無窮大。如果值過小不能表示,則結(jié)果為相應(yīng)的正負零。ECMAScript要求支持IEEE 754規(guī)定的漸進下溢。
使用 / 運算符
/運算符表示除法,產(chǎn)生操作數(shù)的商。左操作數(shù)是被除數(shù),右操作數(shù)是除數(shù)。ECMAScript不支持整數(shù)除法。所有除法運算的操作數(shù)和結(jié)果都是雙精度浮點數(shù)。浮點數(shù)的除法遵循IEEE 754二進制雙精度幅度浮點算法規(guī)則:
- 若兩個操作數(shù)之一為NaN,結(jié)果為NaN。
- 假如兩個操作數(shù)的正負號相同,結(jié)果就是正的,如果不同就是負的。
- 無窮大被零乘結(jié)果是NaN。
- 無窮大被無窮大除結(jié)果是NaN。
- 無窮大被零除結(jié)果是無窮大。符號按照前面說過的規(guī)則決定。
- 無窮大被非零有窮的值除結(jié)果是有正負號的無窮大。符號按照前面說過的規(guī)則決定。
- 有窮的非零值被無窮大除結(jié)果是零。符號按照前面說過的規(guī)則決定。
- 零被零除結(jié)果是NaN;零被其它有窮數(shù)除結(jié)果是零,符號按照前面說過的規(guī)則決定。
- 有窮的非零值被零除結(jié)果是有正負號的無窮大。符號按照前面說過的規(guī)則決定。
- 其它情況下,既沒有無窮大也沒有NaN參與運算,結(jié)果計算出來后會按照IEEE 754 round-to-nearest模式取到最接近的能表示的數(shù)。如果值過大不能表示,則結(jié)果為相應(yīng)的正負無窮大。如果值過小不能表示,則結(jié)果為相應(yīng)的正負零。ECMAScript要求支持IEEE 754規(guī)定的漸進下溢。
使用 % 運算符
%運算符產(chǎn)生其運算符在除法中的余數(shù)。左操作數(shù)是被除數(shù),右操作數(shù)是除數(shù)。
在C和C++中,余數(shù)運算符只接受整數(shù)為操作數(shù);在ECMAScript,它還接受浮點操作數(shù)。
浮點數(shù)使用%運算符的余數(shù)運算與IEEE 754所定義的"remainder"運算不完全相同。IEEE 754 “remainder”運算做鄰近取整除法的余數(shù)計算,而不是舍尾除法,這樣它的行為跟通常意義上的整數(shù)余數(shù)運算符行為不一致。而ECMAScript語言定義浮點操作%為與Java取余運算符一致;可以參照C庫中的函數(shù)fmod。
ECMAScript浮點數(shù)的取余法遵循IEEE 754二進制雙精度幅度浮點算法規(guī)則:
- 若兩個操作數(shù)之一為NaN,結(jié)果為NaN。
- 結(jié)果的符號等于被除數(shù)。
- 若被除數(shù)是無窮大或者除數(shù)是零,或者兩者皆是,結(jié)果就是NaN。
- 若被除數(shù)有窮而除數(shù)為無窮大,結(jié)果為被除數(shù)。
- 若被除數(shù)為零且除數(shù)非零且有窮,結(jié)果與被除數(shù)相同。
- 其它情況下,既沒有0,無窮大也沒有NaN參與運算,從被除數(shù)n和除數(shù)d得到浮點數(shù)余數(shù)r以數(shù)學關(guān)系式 r = n ? (d × q) 定義,其中q是個整數(shù),在n/d為負時為負,在n/d為正時為正,它應(yīng)該在不超過n和d的商的前提下盡可能大。結(jié)果計算出來后會按照IEEE 754 round-to-nearest模式取到最接近的能表示的數(shù)。
更多建議: