소수점 표시
글쓴이: kkb / 작성시간: 수, 2022/07/27 - 6:05오전
value가 42195 일때,
value = 42.195와 같이 찍으려고 하는데
이와 같은 코드가 엄청 많아서
#define INT(val) (val/1000) #define DEC(val) abs(val%1000) int value; printf("value = %d.%03d \n", INT(value), DEC(value));
이렇게 한번 바꾸어 보았습니다.
더 간단하고 보기 좋게 할 수 있는 방법이 있을까요?
혹시, 아래와 같이 하는 것은 안좋죠?
#define INT(val) (val/1000) #define DEC(val) abs(val%1000) #define COMB(val) INT(val),DEC(val) int value; printf("value = %d.%03d \n", COMB(value));
Forums:
소수점을 찍는 rule이 뭔지는 모르겠지만 저라면
소수점을 찍는 rule이 뭔지는 모르겠지만 저라면
char buf[100];
sprintf(buf, "%d", value);
printf("%c%c.%s\n", buf[0], buf[1], &buf[2]);
로 일단 해볼 거 같네요. 테스트는 안해봤습니다.
답변 감사합니다
답변 감사합니다
질문글에서도 이미 말씀 드렸지만
말씀하신대로 하면 코드가 아래와 같이 되어서
그걸 최대한 간단하고 보기 좋게 패턴화하려는 것이 질문입니다.
어떤 식으로 찍을 것이냐의 질문은 아니고요.
실제 출력은 아래보다 훨씬 많습니다.
그리고 말씀하신 코드는 102506이라는 값 즉, 102.506이나 3141 즉, 3.141에 대해서 유연성이 떨어질 것 같네요.
#include <stdio.h>
이런 걸 원하시나요?
답변 감사합니다.
답변 감사합니다.
그것도 좋지만
그렇게 할거면 아래와 같이 하는 것이 훨씬 간단하지 않을까요?
이런 걸 원한 건 아닌데
커널코드에서의 소수출력 부분(소수 정의가 안되니까)도 찾아봤는데
딱히 간단하게 한 건 없더라구요.
간단히 되는 게 아닌가보네요.
감사합니다.
#define show_something(buf, value) \ do { \ sprintf(buf, "%d.%03d", value/1000, abs(value%1000)); \ } while(0)
아마 정수를 1/1000 한 값을 나타내는 것으로
아마 정수를 1/1000 한 값을 나타내는 것으로 보이는데 음수와 1000보다 작은 값은 좀 까다롭네요.
아래와 같이 수정해 봤습니다. 개인적으로 /, % 연산자는 가급적 안쓰는 관계로 복잡한 것은 참고만 하세요.
Hello World
12345.678
3141.592
-0.002
-1234.556
-0.342
0.045
12345.678
3141.592
-0.002
-1234.556
-0.342
0.045
이게 더 낫겠네요.
이게 더 낫겠네요.
value가 음수일 때 테스트 해보세요. 원하시는
value가 음수일 때 테스트 해보세요. 원하시는 결과인지.
아, abs가 있군요. :)
아, abs가 있군요. :)
지금까지 올라온 코드 중 두 개를 조금 변형해서...
지금까지 올라온 코드 중 두 개를 조금 변형해서...
또는
#define show_something(buf, value) \ do { \ int tmp = (value); \ sprintf(buf, "%d.%03d", tmp/1000, abs(tmp%1000)); \ } while(0)
를 선호합니다.
======
괜한 걱정처럼 들릴 수 있는 점 알고 있습니다만, 매개변수를 두 번 이상 평가하는 C/C++ 매크로는 별로 좋아하지 않습니다.
매개변수에 함수 호출 표현식이라던가 기타 side effect가 있는 수식을 넣어서는 안 된다는 걸, 매크로를 작성한 사람은 알더라도 다른 사람은 모를 수 있으니까요.
맞는 말씀입니다.
맞는 말씀입니다.
댓글 달기