Domanda

Bene, devo fare alcuni calcoli nello script PHP. E ho un'espressione che si comporta male.

echo 10^(-.01);

Output 10

echo 1 / (10^(.01));

Output 0

echo bcpow('10', '-0.01') . '<br/>';

Output 1

echo bcdiv('1', bcpow('10', '0.01'));

Output 1.000 ....

Sto usando bcscale (100) per i calcoli BCMath.

Excel e Wolfram Mathematica danno una risposta ~ 0,977237.

Qualche suggerimento?

È stato utile?

Soluzione

Il cursore è il bit operatore XOR in PHP. Devi utilizzare pow () per numeri interi.

Altri suggerimenti

PHP 5.6 ha finalmente introdotto un innato power operator, annotato da un doppio asterisco ( ** ) - da non confondere con ^ , l'operatore XOR bit a bit.

Prima della 5.6:

$power = pow(2, 3);  // 8

5.6 e versioni successive:

$power = 2 ** 3;

È disponibile anche un operatore di assegnazione:

$power   = 2 ** 2;
$power **=      2;  // 8

Attraverso molte discussioni e votazioni, è stato deciso che l'operatore sarebbe stato associativo a destra (non a sinistra) e la precedenza dell'operatore è sopra l'operatore bit a bit non ( ~ ).

$a = 2 **  3 ** 2;  // 512, not 64 because of right-associativity
$a = 2 ** (3 ** 2); // 512

$b = 5 - 3 ** 3;    // -22 (power calculated before subtraction)

Inoltre, per qualche motivo che non ha molto senso per me, la potenza viene calcolata prima dell'operatore unario negatore ( - ), quindi:

$b = -2 ** 2;        // -4, same as writing -(2 ** 2) and not 4

L'operatore ^ è bit a bit Operatore XOR . Devi utilizzare pow , bcpow o gmp_pow :

var_dump(pow(10, -0.01));  // float(0.977237220956)

La funzione bcpow supporta solo esponenti interi. Prova invece a utilizzare pow .

A partire dal 2014, e l'aggiornamento alfa di PHP 5.6, c'è una funzionalità molto inclusa che spero arrivi alla versione finale di PHP. È l'operatore ** .

Quindi puoi fare 2 ** 8 per ottenere 256 . PHP Docs afferma: "Un operatore associativo ** associato è stato aggiunto per supportare l'espiazione".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top