2013-08-21 3 views
5

기본적으로 mysqli는 모든 값을 문자열로 반환하므로 MYSQLI_OPT_INT_AND_FLOAT_NATIVE 옵션을 사용하면 int 및 float을 해당 유형으로 변환 할 수 있습니다. 이것은 소수 필드에 영향을주지 않지만.PHP에서 문자열로 반환 된 MySQL 십진수 필드

수동으로 $value = (float) $row->some_decimal_field을 호출하지 않고도 모든 십진수 필드를 PHP float 유형으로 자동으로 캐스팅 할 수 있습니까?

답변

1

매우 의심 스럽습니다. 십진수는 고정 소수점 수학을 사용하며 PHP에서이를 제공 할 수있는 데이터 유형이 없습니다. 플로트가 가깝지만 실제로는 반올림되어 float에 2를 지정하면 1.99999999999999999가됩니다. 그래서 MySQL이 PHP 부동 소수점으로 10 진수를 얻을 수있는 방법을 제공하더라도 10 진수에서 부동 소수점으로 캐스팅하여 데이터가 손실 될 위험이 있습니다.

깔끔하게 처리하려면 GMP과 같은 것이 필요하지만 MySQL이 자동으로 제공 할 수는 없다고 생각할 수 있습니다. PHP로 수동으로해야 할 것입니다. 여기

0

당신이 문제를 해결하기 위해 PHP로 할 수있는 일이다

function string_to_float($foo){ 
    if($foo*1==$foo && !empty($foo)){ 
     return $foo*1; 
    } else { 
     return $foo; 
    } 
} 

string_to_float($row->some_decimal_field); 

진짜 문제는, 왜 진수 문자열의 형식을 변환해야합니까? 수학에서 사용하려는 경우 PHP가 자동으로 변환을 수행합니다. 10 진수 문자열은 동일한 값을 가진 부동 소수점과 같습니다.

$foo = "1.2"; 
$bar = 1.2; 


if($foo===$bar){ 
    $equivalent = "is"; 
} else { 
    $equivalent = "is not"; 
} 

print '"1.2" '.$equivalent.' equal to 1.2 in type and value<br />'; 

if($foo==$bar){ 
    $equivalent = "is"; 
} else { 
    $equivalent = "is not"; 
} 

print '"1.2" '.$equivalent.' equal to 1.2 in value<br />'; 

$foo = "1.2"*1; 
$bar = 1.2; 

if($foo===$bar){ 
    $equivalent = "is"; 
} else { 
    $equivalent = "is not"; 
} 

print '"1.2"*1 '.$equivalent.' equal to 1.2 in type and value<br />'; 

반환합니다 : 당신이 정상 연산자를 사용하여 문자열에 어떤 수학을한다면 당신은 부동 소수점 데이터 유형으로 고정 소수점 데이터 유형을 캐스팅 될

"1.2" is not equal to 1.2 in type and value 
"1.2" is equal to 1.2 in value 
"1.2"*1 is equal to 1.2 in type and value 
+0

다음은 간단한 테스트입니다. 위에서 언급 한 것처럼 GMP를 사용하지 않으면 이상한 결과 나 이상한 숫자의 근사치를 얻을 수 있습니다. –

+0

네가 옳은 대답일지도 모르지만, 다른 사람들이 그렇게하기를 원하는 사람들을 도울 수있는 대답이다. – amaster

관련 문제