2009-03-05 2 views
4

을 예상대로 작동하지 (훨씬 더 큰 기능의 일부, 그러나 이것은 관련 테스트 비트입니다) :C 수학 계산은 내가 프로그램에서 다음과 같은 한

x = a + (a * (b/100)) 
: 기본적으로이 금액

int test = 100 + (100 * (9/100)); 
sprintf (buf, "Test: %d\n\r", test); 
display_to_pc (buf, player); 

여기서 a는 주어진 숫자이고, b는 백분율 변경자이며, x는 결과입니다 (원본과 원본의 비율).

그것은 저를 준다 : 내 머리에 수학이 잘못 될 줄 알았는데,하지만 난 내 IDE에서 여러 계산기, 심지어 식 계산기를 확인했습니다, 그리고 그들 모두가 나에게 기대 결과를 제공

Test: 100 

첫 번째 표현식은 109입니다.

내가 누락 된 부분에 대해 누구에게도 깨달을 수 있습니까?

감사합니다. :)

+0

정수 내에서만 산술을 사용하면 결과가 어떻게 계산되는지 확인해야합니다 (예 : 100이 분수가 아닌 정수로 9가되는 빈도를 생각해보십시오. –

답변

14

교환 제로

int test = 100 + (100 * (9/100)); 

int test = 100 + (100 * 9/100); 
// x = a + (a * b/100) 

및 예상대로 작동합니다. 9/100은 정수 나누기를 사용하여 수행됩니다. .09의 가장 가까운 정수는 0 (및 0 * 100은 여전히 ​​0입니다.)입니다.

먼저 곱셈을 수행하면 900/100이되며 이는 사용자가 예상 한 9을 제공합니다.

정수 정밀도 이상이 필요한 경우 부동 소수점 경로로 이동해야 할 수 있습니다.

+0

당신은 명시 적 캐스트를하는 것이 더 좋을 것이라고 생각합니다. 또는 부동 소수점 상수를 사용하는 것이 코드를 리팩토링하는 경우 평가 순서에 따라 달라질 수 있습니다. 적어도 다음 프로그래머 (당신이 될 수있는 사람)에게 부동 소수점이어야한다는 경고를 명시 적으로 던지면됩니다. – tvanfosson

+0

잘 모르겠습니다. 나는 "나눗셈을하기 전에 곱셈"을 해왔다. (오히려 넘치지 않을 숫자에 대해) 오랜 동안 나를 위해 자연스럽게 보였다. 내가 그것을 피할 수 있으면 나는 FP에 들어 가지 않으려 고 노력한다. 나는이 경우주의가 현명하다는 것에 동의 할 것이다. –

+0

@tvanfosson : 누군가가 작업 순서를 변경하면 코드의 동작이 변경됩니다. 아무도 그렇게하지 않고 같은 방식으로 작동 할 것이라고 기대하지 않습니다. 그리고 부동 소수점 일 필요는 없습니다 ... 때로는 정수 수학을 원하고, 그 중 하나처럼 보입니다. – rmeador

3

int test = 100 + (100 * (9/100));

1백분의 9 = 0

0 * 100 = 0

100 + 0 = 100

1

9/10의 대답은 0으로 잘립니다 한 다음에 100 것을 곱하면, 그런 다음 100을 더하십시오.

8

정수 계산을 사용하고 있습니다.

100분의 9 = 0

100 + (100 * (0) = 100

귀하의 계산기 사용 부동 소수점 연산을하고, 적절하게 소수를 처리 할 수 ​​있습니다. 당신은 정수를 사용하는

2

을 분할 정도로 100분의 9 정도로 test = 100 + 0 = 100

3

귀하의 실수는 9/100이 정수 나누기로 해석되며 0과 0.09가 아닌 것으로 평가됩니다.

9/100을 쓸 수 있습니다.0 대신 표현식을 재 배열 할 수 있습니다.

4

다른 사람들도 지적했듯이 문제는 정수형을 수행하고 있다는 것입니다. 변수를 double 형으로 캐스팅하거나 double 상수를 사용하여 부동 소수점으로 계산을 수행 한 다음 잘라내어 정수부 만 제공하도록 허용해야합니다.

x = a + (a * (b/100.0)); 

또는

x = a + (a * ((double)b/100))); 
1

변경 :

int test = 100 + (100 * (9/100)); 

int test = (int)(100 + (100 * (9/100.0))); 

에 예상대로 작동되는지 확인합니다.

EDIT : 와우. 내가 타이핑하는 동안 많은 답. 그들 대부분도 일할 것입니다.

1

부동 소수점 산술을 사용해야 9/100이 0.09가됩니다.

int 시험 = 100.0 + (100.0 * 9.0/100.0);

2

전체 정수 값이 될 식으로 만 작업하는 경우 Daniel L의 대답을 사용하십시오. 당신은 당신의 변수 종류의 정수를 사용하는

int test = 100.0 + (100.0 * (9.0/100.0)); 
0

, 그래서 가장 안쪽 식 (1백분의 9)가 발생합니다 : 당신이 일하게 될 것입니다 값이 덜 깨끗 경우, 대신에 정수 리터럴의 이중 리터럴을 사용 100.0 (

플로트 시험 = 100.0 +하십시오 0 그런 다음 표현은

가 원하는 결과가 대신 플로트를 사용하려고 얻으려면 100 * 0 0, 및 + 0 마침내 100 ... 것 * (9.0/100.0));

printf ("result : % 0.2f \ n", test);