原始碼: calculate
測試案例及注意事項
string calnum01 =
"(2+3*5)*("
;//括號不匹配
double ans01 = integer.min_value;
string calnum011 ="";
//括號不匹配
double ans011 = integer.min_value;
string calnum012 = null;
//括號不匹配
double ans012 = integer.min_value;
string calnum02 =
"(5/3*( 3+3)"
;//括號不匹配
double ans02 = integer.min_value;
string calnum03 =
"(4*6 )+(2+/ 3+ 4 -5)"
;//運算子多餘
double ans03 = integer.min_value;
string calnum04 =
"2*(.23+4)"
;//小數點不匹配
double ans04 = integer.min_value;
string calnum042 =
"2*(1.23+0 .0.4)"
;//數字,小數點不匹配
double ans042 = integer.min_value;
string calnum043 =
"2*(1.2 .3+0 4)"
;//數字,小數點不匹配
double ans043 = integer.min_value;
string calnum044 =
"2*(=1.23+04)"
;//非僅含數字和運算子
double ans044 = integer.min_value;
string calnum045 =
"2*(1.2d3+0j4)"
;//非僅含數字和運算子
double ans045 = integer.min_value;
string calnum05 =
"2 + 3 * 6 / 2 + 8"
;double ans05 =19;
string calnum051 =
"2 + 03 * 6 / 002 + 8"
;double ans051 =19;
string calnum06 =
"2.1 5+3.45* 6/2+ 8.1"
;double ans06 =
20.6
;string calnum07 =
"(2.15+3.451 77)*6/2+ 8.1-(2.1 7 *45-2*3)"
;double ans07 =
-66.74469
;string calnum08 =
"23.6 7+12.41*(2.3 +5.90)+(12/2 + 3.41)*(8 /4+3-6/2)"
;double ans08 =
144.252
;string calnum09 =
"102 + 3 * 6 / 2 + 10008"
;double ans09 =
10119
;
public
boolean
check
(string s)
//1、將string資料去空格 :s.replaceall(" ","");
s = s.
replaceall
("\\s*",""
);//2、是否僅含數字、字元(+、-、*、/、(、))、小數點
string pattern =
"([+\\-*/()\\d.]?)*";if
(!s.
matches
(pattern)
)//3、判斷括號是否符合標準if(
!effectbrackets.
effectbracketsbystack
(s))
//4、判斷運算子是否符合標準
/*listlistchar = new arraylist() };*/
list
listchar = stream.of(
'+',
'-',
'*',
'/')
.collect
(collectors.
tolist()
);boolean flagchar =
false
;for
(int i =
0; i < s.
length()
; i++
)//出現( + 運算子,經過前面的括號匹配,所以此處的 i 不可能是最後一位,可以放心使用i+1
if(s.
charat
(i)==
'('&& listchar.
contains
(s.charat
(i+1))
)//出現 運算子 + )
if(flagchar &&
")".
equals
(string.
valueof
(s.charat
(i))))
flagchar = listchar.
contains
(s.charat
(i));}
//5、判斷數字是否標準
//在 calculate 的 count 中做過了
return
true
;}
//處理輸入的計算式
public list
string2list
(string s)if(
isoption
(c))
list.
add(string.
valueof
(c));}
}if(sb.
length()
!=0)return list;
}
//中綴表示式轉化為字尾表示式
private list
infix2suffix
(list
infixlist)
elseif(
"+".
equals
(s)||
"-".
equals
(s))}}
stacktemp.
add(s);}
elseif(
")".
equals
(s))
stacktemp.
pop();
}else
}//注意:兜底stack中的資料
while
(!stacktemp.
empty()
)return suffixlist;
}
//計算字尾表示式,並返回運算結果
private
double
count
(list
suffixlist)
int v1 = integer.
parseint
(de[0]
);value = v1 + double.
parsedouble
(de[1]
)/ math.
pow(
10, de[1]
.length()
);}else
stack.
push
(value);}
else
stack.
push
(value1);}
}return stack.
pop();
}
//判斷是否為數字,需要考慮到小數點
private
boolean
isdigital
(char c)
character[
] c1 =
;string[
] s1 =
;//判斷是否為操作符
private
boolean
isoption
(char c)
//判斷是否為操作符
private
boolean
isoption
(string c)
浮點數進行計算
public static void main string args 為什麼會出現這種情況?計算機採用二進位制進行計算,有些資料可以用二進位制表示。如0.5 1 2 2 1 但是有些不行,如0.1,這就好像1 3用十進位制無法準確的表示。計算機採用機器語言來表示數值,即二進位制 名稱意義 原碼正數...
浮點數的運算
規格化的浮點數因為儲存是使用類似科學計數法的表示,因此計算方法大體上與科學計數法較為類似。浮點加減法的一般步驟 減法本質也是加法 對於二進位制形式的兩個浮點數相加 1.對階 對於兩個規格化浮點數,將較小的指數的數向較大指數的數對齊。通過移動小數點實現。如果出現有效數字位數不能滿足的情況,進行近似。2...
浮點數運算的陷阱
浮點數的運算不能說是精確的,因為某些數字不能準確表示為二進位制 例如 0.1 以下是乙個用浮點數運算的例子,例子證明了我們應該慎用浮點數運算。author crane.ding public class test 執行結果如下 0.70000005 false 0.7000000238418579 ...