可以進行浮點數運算的計算器

2021-10-08 17:30:06 字數 4436 閱讀 5050

原始碼: 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 ...