정수 나누기 : 이중을 어떻게 생성합니까?
이 코드 블록의 경우 :
int num = 5;
int denom = 7;
double d = num / denom;
의 값은 d입니다 0.0. 다음을 캐스팅하여 강제로 작동시킬 수 있습니다.
double d = ((double) num) / denom;
그러나 올바른 double결과 를 얻는 다른 방법이 있습니까? 나는 일어날 수있는 일을 알고있는 프리미티브 캐스팅을 좋아하지 않습니다.
double num = 5;
그것은 캐스트를 피합니다. 하지만 캐스트 전환은 명확하게 정의되어 있습니다. 추측 할 필요는 없으며 JLS를 확인하십시오 . int to double은 확장되는 변환입니다. §5.1.2 부터 :
확장 기본 변환은 숫자 값의 전체 크기에 대한 정보를 잃지 않습니다.
[...]
int 또는 long 값을 float로 변환하거나 long 값을 double로 변환하면 정밀도가 손실 될 수 있습니다. 즉, 결과에서 값의 최하위 비트가 일부 손실 될 수 있습니다. 이 경우 결과 부동 소수점 값은 IEEE 754 반올림 모드 (§4.2.4) 를 사용하여 정수 값의 올림 된 버전이 됩니다.
5는 정확히 double로 표현 될 수 있습니다.
캐스팅 프리미티브의 문제점은 무엇입니까?
어떤 이유로 캐스팅하고 싶지 않다면 할 수 있습니다
double d = num * 1.0 / denom;
나는 일어날 수있는 일을 알고있는 프리미티브 캐스팅을 좋아하지 않습니다.
왜 프리미티브를 캐스팅하는 것에 대한 비이성적 인 두려움이 있습니까? 당신이 캐스팅 할 때 아무것도 나쁜 일이 일어날 intA를 double. 작동 방식을 잘 모를 경우 Java 언어 사양 에서 찾아보십시오 . 주조 int하려면 doubleA는 확대 변환 프리미티브 .
분자 대신 분모를 캐스트하여 여분의 괄호를 제거 할 수 있습니다.
double d = num / (double) denom;
하나의 유형을 변경하면 수식이 변경되면이 변수가 계산의 일부로 중지되면 결과가 엉망이되기 때문에 다시 두 번 몰래 기억해야합니다. 계산 내에서 캐스트하는 습관을 만들고 그 옆에 주석을 추가합니다.
double d = 5 / (double) 20; //cast to double, to do floating point calculations
결과를 캐스트해도 효과가 없습니다.
double d = (double)(5 / 20); //produces 0.0
부동 소수점 Math로 연산을 수행하도록 정수의 정수 / 정수 중 하나를 캐스트합니다. 그렇지 않으면 정수 수학이 항상 선호됩니다. 그래서:
1. double d = (double)5 / 20;
2. double v = (double)5 / (double) 20;
3. double v = 5 / (double) 20;
결과를 캐스트해도 효과가 없습니다. 첫 번째 나누기는 우선 순위 규칙에 따라 수행되기 때문입니다.
double d = (double)(5 / 20); //produces 0.0
나는 당신이 생각하는 것처럼 캐스팅에 아무런 문제가 없다고 생각합니다.
유형 주조는 유일한 방법입니다
double정수 나누기에서 생성- 캐스팅 하지 않으면 다른 방법이 없습니다 (명시 적으로하지는 않지만 발생할 수 있습니다).
지금, 거기에 우리가 정확한 얻는 것을 시도 할 수있는 몇 가지 방법입니다 double값은 (여기서 num하고 denom있는 int유형, 그리고 코스 주조와 ) -
명시 적 캐스팅
double d = (double) num / denom;double d = ((double) num) / denom;double d = num / (double) denom;double d = (double) num / (double) denom;
하지만 double d = (double) (num / denom);
암시 적 캐스팅
double d = num * 1.0 / denom;double d = num / 1d / denom;double d = ( num + 0.0 ) / denom;double d = num; d /= denom;
하지만 double d = num / denom * 1.0;
하지double d = 0.0 + ( num / denom );
다음과 같은 것을 사용하십시오 :
double step = 1d / 5;
(1d는 두 배로 캐스트입니다)
오퍼레이션 랩핑을 고려할 수 있습니다. 예를 들면 다음과 같습니다.
class Utils
{
public static double divide(int num, int denom) {
return ((double) num) / denom;
}
}
이를 통해 캐스트가 원하는 것을 정확하게 수행하는지 여부를 한 번만 조회 할 수 있습니다. 이 방법은 테스트를 계속 수행하여 원하는 작업을 계속 수행 할 수 있습니다. 또한 올바른 결과를 얻는 한 나눗셈을 유발하기 위해 어떤 트릭을 사용하든 상관 없습니다 (여기에서 답을 사용할 수 있음). 두 정수를 나눌 필요가있는 곳이라면 어디에서나 Utils::divide그것이 올바른 일을하고 있다고 믿을 수 있습니다 .
이것을 사용하십시오.
int fxd=1;
double percent= (double)(fxd*40)/100;
가장 좋은 방법은
int i = 3;
Double d = i * 1.0;
d is 3.0 now.
참고 URL : https://stackoverflow.com/questions/3144610/integer-division-how-do-you-produce-a-double
'development' 카테고리의 다른 글
| 파이썬 클래스에서 사용되는 'cls'변수는 무엇입니까? (0) | 2020.04.16 |
|---|---|
| PHP PDO 문은 테이블 또는 열 이름을 매개 변수로 사용할 수 있습니까? (0) | 2020.04.16 |
| 자바로 DOM 파싱 정규화-어떻게 작동합니까? (0) | 2020.04.16 |
| 다른 선택적 매개 변수를 생략하면서 선택적 매개 변수를 전달하는 방법은 무엇입니까? (0) | 2020.04.16 |
| Windows 응용 프로그램 아이콘에는 어떤 아이콘 크기가 포함되어야합니까? (0) | 2020.04.16 |