double a = 18.2;
Debug.Log(a);
Debug.Log(a.ToString("G17"));
Debug.Log(a.ToString("G17"));
이렇게 하면 두 로그가 다 18.2, 혹은 18.200000000000000가 나올거라고 생각했는데... 실제론 아래처럼 나옴.
아마 정밀도 관련 문제라고 생각은 하는데 어떻게 해결해야 할지 도통 모르겠네...
참고로 이딴 걸 왜 쓰고 있냐면,
double로는 숫자 크기가 감당이 안되서 무한 자료형을 위해 에셋(Infinite Value)을 사용하고 있는데
해당 에셋이 double을 형 변환할 때 string을 통해 변환하고 있거든;
결과적으로 1820%라고 떠야 할 숫자가 1819%라고 뜨고 있어.
게임에 영향을 줄만한 차이는 아닌데 보기가 다소 불쾌함 ㅇㅇ.
혹시 짐작가는 해결 방법이나 검색어가 떠오르는 친구 있으면 답변 부탁해 ㅠ
decimal 써도 속도 나쁘진 않던데. 에셋 개조하려면 귀찮겠네
백분율단위로 소수점 없이 변환해서 쓰는거면
(int)(a*100) 해서 정수로 사용해보시는것은 어떰?? 근데 무슨상황인지 잘 감이 안와서 도움이 될지 모르것네
var a = 18.2 * 100; Debug.Log(a); Debug.Log(a.ToString("G17"));
변환할 자릿수(소수점) 까지 10의거듭제곱으로 곱한 뒤에 연산이 끝나고 다시 나누는 방식은 어떰?
아마도 double형이라 해도 최대자릿수가 가수포함 17자리로 기억하는데,? 아닌가. 가수부분 맨앞은 무조건 1이니깐 16자리고 정밀도 문제 맞을것 같어 한 15자리까지가 안전빵 될고같네 string.format(format,arg1,arg2...) 방식으로 테스트해봐
저거 tostring 인수로 넣는 값들 string format c# msdn 찾아보면 있을거야 ㅇㅇ
질문이 어려워서 이해못했다... 에셋 string 변환과정에서 1퍼가 누락된다는 거네 그럼 이런경우 0.001f 값을 더핮 면 되진아 1%이하를 안쓰고 있으니깐.. 실제로 회사 클라들은 이런꼼수 마니써
수학에서 0.99999... 는 1.0 과 같잖아. 그러니 저 출력 결과는 틀린 결과는 아니야. 다만 게임에서 우리가 보기 원하는 표기방법이 아닐뿐이지. 이론 경우는 그냥 화면 출력하기 전에 매우 작은 수 0.0000001 ("epsilon" 이라고 부름) 을 더한 후 출력해주면 해결되는 문제라고 생각함. (나도 잘 모르는데 헛소리한걸수도 있음)
출력할 때 소수점아래 2자리까지만 필요하면 출력할 때 0.001 씩 더해서 출력하면 되긴 함 - dc App
답변들 고마워! 많은 힌트가 되었어. 댓글로 남겨 준 방법들을 다양하게 시도해보고 가장 상황에 맞는 걸 적용해볼게. 다들 좋은 하루 보내고, 개발 열심히 해!