我試圖執行簡單的java程式來計算結果,運算式為:v^2 - u^2 / 2as
那是v*v - u*u / 2*a*s
代碼在 java 11 中
int v=16;
int u =5;
int a = 7;
int s = 9;
int res1 = v*v;
int res2 = u*u;
double FunRes1 = Math.pow(v, 2);
double FunRes2 = Math.pow(u, 2);
int part1 = res1 - res2;
int part2 = 2 *a*s;
int result = part1/part2; // = All 4
int AllResult = (v*v-u*u)/2*a*s; // == results
double doubleResult = FunRes1-FunRes2 / 2*a*s; // === have different
double doubleResult2 = (FunRes1-FunRes2) / 2*a*s; // ==== answers (see ss above)
所有 4 個變數(result、AllResult、doubleResult1、doubleResult2)的 asnwers 都不同。任何人解釋為什么會發生這種情況?數學上的正確答案是什么?
uj5u.com熱心網友回復:
這是因為運算子優先級。如果我寫了類似的東西2 * 8 / 8 - 6,而沒有進一步的背景關系,那么應該如何評估它是模棱兩可的。這可能導致不同的結果。例如(2 * 8) / (8 - 6) == 8但是((2 * 8) / 8) - 6 == -4。為了消除歧義,Java 使用了在大多數語言中通用的優先規則串列。您可以在此處找到完整串列。
對于您的情況,重要的部分是在加法和減法之前應用乘法和除法。
另外值得注意的是,在具有相同優先級的運算子的情況下會發生什么,這也出現在您的示例中。
當相同優先級的運算子出現在同一個運算式中時,必須有一條規則來控制首先計算哪個。除了賦值運算子之外的所有二元運算子都是從左到右計算的;賦值運算子從右到左求值。
回到我們的例子2 * 8 / 8 - 6。我們可以看到(從這里)java 將在減法之前計算乘法和除法。*并且/具有相同的優先級并且都是二元運算子,因此我們從左到右評估它們。這給我們留下了((2 * 8) / 8) - 6這就是為什么 java 將其評估為-4
System.out.println(2 * 8 / 8 - 6);
-4
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/528408.html
