아직 미완성인 프로젝트 입니다.
iPhone에 내장되어 있는 계산기와 기능 및 디자인을 동일하게 만든 iOS 앱 입니다.
기본적인 연산 (+, −, ×, ÷) 이 가능합니다.
- 출력값을
Int
type 으로 변환해도 상관 없는 경우,Int
type 으로 출력 결과를 반환합니다.
그러나 그렇지 않은 경우는Double
type 으로 출력합니다.
- +, − 연산은 전체 식의
result
값을 화면에 출력
- ×, ÷ 연산은 해당 연산의 결과값인
temp
만 출력
문제 인식
-
연산 결과가 예상과는 다르게 Int type 으로 변환이 안되고
0.2000...
과 같이 너무 길게 출력 -
Double type 을 입력 받은 후 곱하기, 나누기 연산을 하면, 결과값이 다르게 나오는 상황 발생
-
Swift 자체의 연산 결과가 틀림
print(3.3 * 3) // 9.89999999... 출력
Solution
-
round()
를 사용하여 소수점 아래 N번째 숫자에서 반올림 하도록 코드 작성print(round(3.3 * 3 * 1000) / 1000) // 9.9 출력
-
해당 function 수정
func intOrDouble(_ value: Double) -> String { let roundedValue = round(value * 1000000000) / 1000000000 if roundedValue - Double(Int(roundedValue)) == 0 { return String(Int(roundedValue)) } else { return String(roundedValue) } }
문제 상황
- 앱을 시작하고 첫 연산이 곱셈인 경우에 대해 이후 덧셈을 할 경우 결과가 0으로 출력되는 오류 발생
- 예를 들어보자.
10 * 10 * 10 + 10 을 계산하면 + 버튼을 누름과 동시에 화면에 0 이 출력됨
문제 인식
+
또는-
버튼을 누름과 동시에 이상한 결과가 출력되므로 해당@IBAction func
에 문제가 있음을 인식- 첫 연산이 곱셈/나눗셈인 경우에만 이 오류가 발생하기 때문에 이전 연산이 없는 경우에 대해 문제가 있음을 인식
아래 코드는 기존 @IBAction func sumButton
의 일부이다.
...
// 과거 상태가 곱하기나 나누기면, result에 temp 값을 더하거나 뺌
// 과거 상태가 더하기나 빼기면, result에 inputNum 값을 연산
if pastState == "multi" || pastState == "div" {
if beforeMultiState == "" {
result = calculateTwoNumbers(state: pastState, num1: result, num2: inputNum) // error
} else {
result = calculateTwoNumbers(state: beforeMultiState, num1: result, num2: temp)
}
} else { // sum or sub
result = calculateTwoNumbers(state: pastState, num1: result, num2: inputNum)
}
...
temp
란? 연산의 임시 결과값으로=
을 누르기 전까지 화면에 보이는 값을 의미result
란? 현재의 최종 결과값으로 현재 상태가sum
이나sub
일 때만 계산하여 값을 바꿈beforeMultiState
란? 곱셈/나눗셈 전 상태가 덧셈이었는지 뺄셈이었는지 알기 위해 만든 변수로 초기값은""
이며,result
값을 구하기 위해 사용됨
문제가 되는 부분: result(=0)
와 inputNum
을 pastState(곱셉/나눗셈)
으로 계산하기 때문에 0 이 나올 수밖에 없음
Solution
- 해당 function 수정
...
if pastState == "multi" || pastState == "div" {
if beforeMultiState == "" {
result = temp // temp = calculateTwoNumbers(state: pastState, num1: temp, num2: inputNum)
} else {
result = calculateTwoNumbers(state: beforeMultiState, num1: result, num2: temp)
}
} else { // sum or sub
result = calculateTwoNumbers(state: pastState, num1: result, num2: inputNum)
}
...
- Xcode 12.3
- Swift 5