programing

정수 나눗셈:어떻게 더블을 만들죠?

sourcetip 2022. 7. 9. 09:53
반응형

정수 나눗셈:어떻게 더블을 만들죠?

이 코드 블록의 경우:

int num = 5;
int denom = 7;
double d = num / denom;

의 가치d0.0. 캐스팅을 통해 강제로 작동시킬 수 있습니다.

double d = ((double) num) / denom;

하지만 다른 방법이 있을까요?double결과?무슨 일이 일어날지 모르는 원초적 요소를 캐스팅하는 건 싫어요.

double num = 5;

그러면 깁스를 피할 수 있습니다.하지만 배역 전환이 명확하다는 것을 알게 될 것이다.추측할 필요 없이 JLS를 확인하세요. 두 배로 확대되는 변환입니다.§ 5.1.2부터:

기본 변환을 확대해도 숫자 값의 전체 크기에 대한 정보가 손실되지 않습니다.

[...]

int 또는 long 값을 float로 변환하거나 long 값을 2배로 변환하면 정밀도가 저하될 수 있습니다.즉, 그 결과 값의 최하위 비트가 손실될 수 있습니다.이 경우 결과 부동소수점 값은 IEEE 754 라운드 투 근접 모드('4.2.4)를 사용하여 올바르게 반올림된 정수값이 됩니다.

5는 정확히 2배로 표현될 수 있다.

원형을 캐스팅하는 게 뭐가 문제죠?

어떤 이유로든 캐스팅이 싫다면

double d = num * 1.0 / denom;

무슨 일이 일어날지 모르는 원초적 요소를 캐스팅하는 건 싫어요.

왜 당신은 원형을 캐스팅하는 것에 대해 비이성적인 두려움을 가지고 있나요?캐스팅을 하면 나쁜 일은 일어나지 않습니다.int에 대해서double동작 방법을 모르는 경우는, Java Language Specification(Java 언어 사양)을 참조해 주세요.캐스팅 중int로.double확대되고 있는 원시적인 변환입니다.

분자가 아닌 분모를 캐스팅하여 추가 괄호 쌍을 제거할 수 있습니다.

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

활자 주조만이 유일한 방법

당신이 그것을 명시적으로 하지 않을 수도 있지만 일어날 것이다.

자, 이제, 우리가 정확한 정보를 얻을 수 있는 몇 가지 방법이 있습니다.double값(여기서)num그리고.denom이다int유형 및 물론 주조)-

  1. 명시적 캐스팅:
  • 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);

  1. 암묵적 캐스팅:
  • 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 );


자, 만약 당신이 묻는다면, 어느 것이 더 나을까요?명시적입니까?아니면 암묵적인가요?

여기서 단도직입적으로 대답하지 맙시다.간단하게 기억합시다.저희 프로그래머는, 서프라이즈나 마법의 소스는 좋아하지 않습니다.그리고 우리는 부활절 달걀을 정말 싫어해요.

또, 추가 조작을 실시한다고 해서, 코드의 효율이 높아지는 것은 아닙니다.그렇죠?

부동소수점 산술로 연산을 강제로 수행하려면 부동소수점 정수/정수 중 하나를 캐스팅합니다.그렇지 않으면 항상 정수 산술이 선호됩니다.그래서:

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 step = 1d / 5;

(1d는 2배로 주조)

가장 좋은 방법은

int i = 3;
Double d = i * 1.0;

d is 3.0 now.

작업을 정리하는 것이 좋습니다.예를 들어 다음과 같습니다.

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;

'D'만 더하면 돼

int i = 6;
double d = i / 2D; // This will divide bei double.
System.out.println(d); // This will print a double. = 3D

언급URL : https://stackoverflow.com/questions/3144610/integer-division-how-do-you-produce-a-double

반응형