2014-06-23 1 views
2

현재 Swift 애플리케이션을 작성 중이고 그 일부에는 특정 사용자 입력이 특정 값까지 합산되도록해야합니다.Swift의 복식 범위

단순화 예 :

프로그램의 상호 작용을 통해

사용자가에서 totalValue = 67가이 두 개의 입력들에서, 사용자는 67 개까지 추가 두 값을 제공해야한다는 것을 의미 = 2 켜지는지 지정한 .

그래서 차례 한 사용자가 32을 입력하고 32 + 35 = 67

이 모두가 잘 작동하기 때문에 차례로 그는 35 입력 2,이 유효한 것에 말할 수 있지만, 현재 우리 직전 소수점 둘 이상의 자리에 프로그램을 올바르게 추가 할 수 없습니다. 예를 들어, totalValue = 67, then turn 1에서 사용자는 66.95를 입력 한 다음 2 번에 0.05를 입력하면 66.95 + .05 = 67이라는 사실에도 불구하고 프로그램이 오류임을 반환합니다.이 문제는 소수 자릿수 1 개 이하 (예 : 1 턴 = 55.5, 2 턴 = 11.5)가 소수점 이하 두 자리에서만 발생합니다. 값을 double 값으로 저장합니다. 미리 감사는

일부 예제 코드 : 여기

var totalWeights = 67 
var input = Double(myTextField.text.bridgeToObjectiveC().doubleValue) 

/*Each turn is for a button click*/ 

/*For turn 1*/ 
if inputValid == true && turn == 1 && input < totalWeights 
{ 

    myArray[0] = input 

} 
else 
{ 
//show error string 
} 

/*For turn 2*/ 
if inputValid == true && turn == 2 && input == (totalWeights - myArray[0]) 
{ 

myArray[1] = input 

} 
else 
{ 

//show error string 

} 
+1

값 배열을 통해 반복이이 문제를 일으킬 수있는 방법을 알 수 없으므로이 작업을 수행하는 방법에 대한 몇 가지 코드를 보여줍니다. –

+0

변수 뒤에 콜론 (:)을 사용하여 구분하여 형식을 지정해야합니다. let myDoubleValue : Double = 70 대신 let myDoubleValue = 70.0 – eddwinpaz

+0

유형을 가정하지 않습니까? – yaboi

답변

0

불행히도 여기에는 이상적인 해결책이 없습니다. 근사 타입 비교를 사용해야합니다.

if val1 == val2 

우리가 시도해야 뭔가 같은 : 대신 검사의 예를 들어

, 당신은 부동 소수점에서 정확한 값을 원하는 경우에

if val1 > (val2 - .0005) && val1 < (val2 + .0005) 
+0

왜 downvote입니까? 실제로 사실입니다. 우리가 부동 소수점 숫자로 작업하고 있기 때문에 그 부분 만 추가 할 것입니다. 그리고 나는 아마도'0.0005'보다 더 적은 것을 취할 것이고, [기계 엡손 (http://en.wikipedia.org/wiki/Machine_epsilon)]에 더 가깝습니다. 나는이 사건에서 기계의 엡실론이 무엇인지 모르겠다. 그러나 나는 그것이 0.0005가 아니라고 생각한다. – FreeNickname

+1

이것은 문제를 푸는 데 매우 순진한 방법입니다. NSDecimalNumber를 사용하면 (더) 정답입니다. –

+2

이 접근 방법에 대해 순진한 것은 없습니다. 두 가지 부동 소수점 숫자를 비교하는 기본 기술입니다. 'fabs (val1 - val2) <0.0005' – JeremyP

1

이가 일할 수있는 방법의 예입니다 :

var a = 0 
for num in numlist { 
    a += num 
} 
var result = false 
if a == targetnum 
    result = true 

나는 밖으로이 테스트를하지 않은,하지만 numlist 경우의 배열입니다 그러면 유효한 숫자 인 모든 입력에 대해 작동해야합니다.

방금 ​​내가 깨달은 한 가지 문제는 반올림이 문제를 일으킬 수 있으므로 두 배로 동등한 작업을 수행 할 때 문제가 있다는 것입니다. 나는 그것을 보여주지는 않겠지 만, 입력을 읽는 동안 소수점 오른쪽에 몇 개의 숫자가 있는지를 추적하고 모든 값을 그 수십의 숫자로 곱하면 66.95 * 100을 모두 얻게됩니다. 그런 다음 targetnum에 동일한 값 (100)을 곱한 후에 비교를 추가 한 다음 수행하십시오.

+0

값을 취하여 1000을 곱한 값과 비교하는 함수를 만들어 보았습니다. no luck – yaboi

+0

문제는 totalValue = 50이고 내 두 회전이 각각 49.95와 .05 인 경우 프로그램은 totalValue - myArray [0]을 49와 같은 값으로 평가합니다.99999999997 대신 50으로 int로 변환하고 1000을 곱해서 5000의 비교를 생성합니다. == 4999는 false로 평가됩니다. – yaboi

+1

다른 작업을하기 전에 int로 변환하십시오. 그래서 49.95는 4950이고 .05는 5입니다. 그리고 나서 수학을하고 비교하십시오 –

3

다음 플로트/더블 종류가 작동하지 않습니다, 등 그들은 단지 정확한 숫자의 근사치입니다. Swift에서 NSDecimalNumber 클래스를 사용하여보십시오, 브리징이 어떻게 생겼는지는 모르겠지만 간단해야합니다.