解決double型別資料四則運算精度丟失問題

2021-10-21 09:59:33 字數 3338 閱讀 9680

直接對double型別的資料進行計算,很容易發生精度丟失問題

使用bigdecimal類計算,可以避免精度丟失

//double num2 = double.parsedouble(numstack.pop());

//double num1 = double.parsedouble(numstack.pop());

bigdecimal num2 =

newbigdecimal

(numstack.

pop())

; bigdecimal num1 =

newbigdecimal

(numstack.

pop())

;if(arrays[i]

.equals

("+"))

else

if(arrays[i]

.equals

("-"))

else

if(arrays[i]

.equals

("*"))

else

if(arrays[i]

.equals

("/"))

為了完成多個資料的組合運算,這裡使用棧對運算子和運算數進行管理

設計乙個存放字串物件的棧類

public

class

stack

public

intgetsize()

public string peek()

else

}public string pop()

else

}public

void

push

(string o)

@override

public string tostring()

}

計算類

public

class

compute

/* 將字串分割成運算元和操作符的字串陣列

*/public

static string[

]strtoarrays

(string str)

else}}

arrays[arraysindex]

= str.

substring

(beginindex, str.

length()

);string[

] arrays2 =

newstring

[arraysindex+1]

;for

(int i =

0; i < arraysindex+

1; i++

)return arrays2;}/*

將中綴表示式轉為字尾表示式,返回的是字串陣列

*/public

static string[

]topostorder

(string[

] arrays)

else

//操作符為")"時棧頂出棧並輸出,直到遇到"(", "("出棧,")"不入棧

else

if( arrays[i]

.equals

(")"))

operstack.

pop();

//"("出棧

}//其他操作符需要比較與棧頂的優先順序

else

else

//優先順序低或者相等,棧頂出棧並輸出,直到優先順序比棧頂高

else}if

(getpriority

(arrays[i]

.charat(0

))>

getpriority

(operstack.

peek()

.charat(0

)))}

}}}}

//運算元直接新增到 字串陣列2

elseif(

isnum

(arrays[i]))

else

}while

(!operstack.

isempty()

) string[

] arrays3 =

newstring

[tempindex]

;for

(int i =

0; i < tempindex ;i++

)return arrays3;}/*

得到操作符的優先順序

*/public

static

intgetpriority

(char c)

else

if(c ==

'+'|| c ==

'-')

else}/*

由字尾表示式計算得值

*/public

static bigdecimal tocompute

(string[

] arrays)

elseif(

isoper

(arrays[i]))

else

if(arrays[i]

.equals

("-"))

else

if(arrays[i]

.equals

("*"))

else

if(arrays[i]

.equals

("/"))

else

}else

}//double result = double.parsedouble(numstack.pop());

bigdecimal result =

newbigdecimal

(numstack.

pop())

;return result;}/*

判斷該字串是否為操作符

*/public

static

boolean

isoper

(string str)

else}/*

判斷該字串是否為運算元

用棧解決四則運算問題

本文章的解決方法參考了 大話資料結構 中關於棧的應用介紹 值得注意的是,書中關於中綴表示式轉字尾的講解中不盡清楚。本人也在這裡花了點時間進行推敲錯誤的原因,也在網上搜到了這篇文章,比較好地介紹了中綴轉字尾的的規則 原理 用計算機求解四則運算,可以使用棧。因為棧的 先進後出 的特性正好滿足了能通過字尾...

資料結構 四則運算

1.平時我們所接觸到的四則運算都是中序表示式,而要進行程式設計計算時要考慮符號優先順序神馬的很麻煩,故通常將其轉換為前序表示式或者後序表示式 中序表示式 2 3 2 1 3 4 1 前序表示式 23 21 3 41 後序表示式 23 21 341 2.中序轉前序 1.將中序表示式逆 1 4 3 1 ...

資料結構 四則運算

1 c語言實現科學計算器 2 c語言實現四則運算 小型計算器 3 經典演算法 算術表示式求值 4 棧 的典型應用 表示式求值 c語言實現 5 利用c語言 easyx圖形設計 製作簡易計算器 6 從鍵盤上輸入乙個字尾表示式,試編寫演算法計算表示式的值。規定 逆波蘭表示式的長度不超過一行,以符作為 輸入...