2013-03-24 29 views
5

PHP'de float türünü kullanma hakkında Floating-Point guide okudum. Cevap BC Math uzantısını kullanıyor. Dizeleri kullanmak, floatı tam bir tip olarak gösterebilir ve float ve tamsayı sorunlarını önleyebilir.PHP float kullanımı için en iyi yöntem

Bu arada, Github ve BC site uzantısıyla çalışan bu sitede hiçbir iyi örnek bulamadım. PHP'yi dizeleri kullanmaya zorlamak için nasıl temiz bir yol var, bunları nasıl değerlendirmeliyim?

Özellikle BC Math uzantısını MySQL DECIMAL veri türleri ile kullanmanın en iyi yolu nedir?

PHP 5.4.10 ile yaptığım örnek testi, doğru cevap: 0,2999999999996

<?php 
bcscale(13); 

$a = '0.3'; 
$b = '0.0000000000004'; 

echo $a-$b; // 0.3 
echo '<br />'; 
echo bcsub($a, $b); // 0.2999999999996 
echo '<hr />'; 

$a = "0.3"; 
$b = "0.0000000000004"; 

echo $a-$b; // 0.3 
echo '<br />'; 
echo bcsub($a, $b); // 0.2999999999996 
echo '<hr />'; 

$a = 0.3; 
$b = 0.0000000000004; 

echo $a-$b; // 0.3 
echo '<br />'; 
echo bcsub($a, $b); // 0.3000000000000 
echo '<hr />'; 

$a = '0.3'; 
$b = '0.0000000000004' + 0; 

echo $a-$b; // 0.3 
echo '<br />'; 
echo bcsub($a, $b); // 0.3000000000000 
echo '<hr />'; 

$a = (string) 0.3; 
$b = (string) 0.0000000000004; 

echo $a-$b; // 0.3 
echo '<br />'; 
echo bcsub($a, $b); // 0.3000000000000 
echo '<hr />'; 

$a = strval(0.3); 
$b = strval(0.0000000000004); 

echo $a-$b; // 0.3 
echo '<br />'; 
echo bcsub($a, $b); // 0.3000000000000 
?> 
+1

, ilk ve ikinci vakada sorun nedir? Eğer "en iyi" seçeneği bilmek istiyorsanız, tek tırnak '' iki kat daha iyidir '' çünkü çift tırnak kullanırsanız PHP, değişken isimleri ve kaçış sıralarını doldurmak için ekstra zaman harcar. – Dave

+0

Hızlı cevap verdiğiniz için teşekkürler Dave, bu tek tırnakları kullanarak işi yapıyor. Veriler kaybolmadan önce doğru türde bir değere sahip olduğumdan nasıl emin olacağım. Örneğin, mysql – Mike

+0

@Dave satırlarını getirirken, herhangi bir yeni php sürümü ile doğru değildir. Lütfen [bu makaleyi okuyun] (http://nikic.github.com/2012/01/09/Disproving-the-Single-Quotes-Performance-Myth.html). – Maerlyn

cevap

4

iyi yolu M.Ö. Matematik kullanmak ancak GMP kullanarak başlamak değildir. Sadece bir göz at on benchmark. GMP, BC Math'dan 30 kat daha hızlıdır.

DECIMAL (12, 0) AND DECIMAL (27,0) ve php start suck apr kullanıyorum. 10^19 ve daha büyük. Demo:

//PHP Version 5.3.10, FreeBSD 8.2-RELEASE amd64 

$a = pow(10, 18); 
var_dump($a, $a > ($a - 1), ($a - 1) > $a, ($a - 1) == $a, ($a - 1) === $a); 
// int(1000000000000000000) 
// bool(true) 
// bool(false) 
// bool(false) 
// bool(false) 

$a = pow(10, 19); 
var_dump($a, $a > ($a - 1), ($a - 1) > $a, ($a - 1) == $a, ($a - 1) === $a); 

// double(1.0E+19) 
// bool(false) 
// bool(false) 
// bool(true) 
// bool(true) 

Ben here is simple implementationDecimal sınıf yaptı. Daha sonra aynı arayüzü ancak yerel php matematik işlemleriyle veya BC matematiği ile veya istediğiniz gibi uygulayabilirsiniz. Yupp, işlev çağrıları ve nesnelerin oluşturulması için ek yük olacak, ancak diğer geliştiricilerin okuyabileceği kodları yazıyoruz, değil mi?

P.S. PHP Secure Communications'dan gelen çocuklar kendi uygulamalarına sahiptir - tüm potansiyel ihtiyacı kapsayan Math_BigInteger, ancak görevlerim için çok ağırdır.

Güncelleme: PHP 5.6'dan beri GMP internal operators overloading'u uygulamıştır, bu nedenle gmp kaynakları normal sayılar (çoğunlukla) olarak kullanılabilir.

İlgili konular