2016-08-08 9 views
8

여기에 코드 정직하지만 난 결과를 이해하지 않습니다플로팅 곱셈의 캐스팅 결과가 플로트가 변수에 처음 저장되면 다른 결과가 생성됩니까?

float percent = 0.69f; 
int firstInt = (int)(percent*100f); 

float tempFloat = percent*100f; 
int secondInt = (int)tempFloat; 

Debug.Log(firstInt + " " + secondInt); 

firstInt 68 만 secondInt은 69입니다을? 컴파일러는 두 연산을 사용

percent*100f 

식의 값을 파악하고, 거리 계산을 최적화 것처럼

+0

좋은 질문입니다. –

+0

https://dotnetfiddle.net/YMJExy- 결과는'69 69'입니다. – Blorgbeard

+0

로컬 컴퓨터에서 '68 69' 결과가 나옵니다. – jdphenix

답변

1

그것은 보인다. 중간 결과가 float 변수에 저장되면 허용되지 않습니다.

.69는 float 또는 double에서 정확한 표현을 갖지 않으므로 int : double의 서로 다른 측면에있는 두 개의 표현은 약간 위입니다. float은 실제 값인 .69보다 약간 위입니다.

+0

이것은 가능한 정답 인 것 같습니다. 필자는 컴파일러가 'float'계산을 위해 합리적인 최적화를한다고 생각합니다. 그래도 '이중'이라고 생각합니다. 출력이 뻔뻔스럽게 변할 때 하드웨어의 (런타임) 고려 사항은 출력의 가치를 가늠하기 때문에 고려해야 할 사항이 없습니다. 왜 이런 일을하는지 알아? – starlight54

+0

아, 안심, 내 질문에 대한 답변은 의견에서 다른 답변에, C#을 컴파일러는 꽤 많이 때마다 옵션을 주어진 좋아하는 때 더 많은 정밀도를 사용할 수 있습니다, 당신이 말하는대로, '플로트'로 그것을 저장하지 못하도록 그렇게 해. – starlight54