2013-08-21 46 views
5

默認情況下,mysqli以字符串形式返回所有值,MYSQLI_OPT_INT_AND_FLOAT_NATIVE選項允許您將int和float轉換爲適當的類型。儘管這不影響小數位數。在PHP中以字符串形式返回的MySQL小數位字段

有沒有辦法自動將所有十進制字段轉換爲php浮點類型,而無需手動調用$value = (float) $row->some_decimal_field

回答

1

我非常懷疑它。小數使用固定點數學,並且PHP中沒有可以提供這種數據類型的數據類型。浮動接近,但它們實際上是圓形的,這意味着將浮點數賦值爲2可能導致1.99999999999999999。因此,即使MySQL提供了一種將小數轉換爲PHP浮點數的方法,您也有可能通過從小數轉換爲浮點數來丟失數據。

如何幹淨地處理這個問題,你需要像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會自動爲你進行轉換。由於十進制字符串等同於具有相同值的浮點數。下面是一個簡單的測試:

$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

相關問題