2012-10-09 3 views
1

나는이 코드를 가지고 문제는 $3,000,000,000PHP 코드에서 뭔가 빠졌습니까?

입니다 내가 3000000000를 설정으로 $2,147,483,647의 출력을 제공하는 자사의 시작이며, 나는 우리가 형태가 설정 무엇으로부터 원하지만 우리가 $2,147,483,647 이상을 선택하는 경우가 $2,147,483,647에서 시작 http://deewayz.in/demo/ 여기

내 코드입니다 : 여기

라이브 데모입니다.

$v   = isset($_GET['v']) ? (int) $_GET['v'] : 3000000000; 

처음으로 정확합니다. 그러나 우리가 형태로 가치를 바꿀 때 그것은 잘못된 결과를줍니다.

예이를 확인 : 미리 http://deewayz.in/demo/index.php?v=3100000000&sv=5

감사 :) 해결

을 :

$v   = isset($_GET['v']) ? (float) $_GET['v'] : 3000000000; 

답변

3

PHP의 정수의 최대 값은 2147483647로 평가되는 2^31-1이므로 integer overflow의 대소 문자가 있습니다. PHP는 넘어서는 경계의 가장자리로만 값을 제한하여 정수 오버플로를 처리합니다.

이 문제를 해결하려면 더 큰 값 범위가있는 float을 사용할 수 있습니다. E 표기법 또는 캐스팅을 사용하는 것처럼 숫자를 부동 소수점으로 선언하는 데는 여러 가지 방법이 있습니다 (아래 표 참조).

$v   = isset($_GET['v']) ? (float) $_GET['v'] : 3E9; 
+0

아니면 그냥'(float)' – Peon

+0

나는 플로트 감사를 사용하고 작동하는지 확인합니다 – deerox

+0

네, 정말 고마워요. – deerox

2

2147483647가 정수가 제한된다. 데이터 형식을 bigint 또는 float으로 변경하십시오.

+0

이 코드에서이 문제를 해결할 방법이 있습니까? – deerox

+0

PHP에서'longint' /'bigint'도 있습니까? –

+0

int = 2,147,483,647 bigint => 9,223,372,036854775807 – Peon

2

2,147,483,647은 32 비트 정수가 수용 할 수있는 최대 값입니다. 더 큰 숫자의 경우 BCMath 또는 GMP 확장자로 작업하거나 64 비트 버전의 PHP를 사용해보십시오. float를 사용하면 더 긴 숫자를 저장할 수 있으므로 가능성이 있습니다 (그러나 더 이상 정확하지는 않습니다).

+0

Im은 PHP에서 매우 새로 워서 코드를 간단히 변경하면이 코드를 고칠 수 있습니다. – deerox

+0

메신저에서 게시물을 확인하고 알아내는 중입니다. 감사합니다 – deerox

관련 문제