Domanda

Ho un problema, eh.Sto facendo dei calcoli con bitcoin in PHP.Quando chiamo l'API, ottengo indietro JSON con valori bitcoin.Sono stringhe con una precisione di 1 milionesimo di decimale.

Li stavo monitorando come float nella mia app, ma questo ha portato a molti problemi di precisione e perdite.

Quindi, ho deciso di tradurre ogni stringa in un numero intero e memorizzare la "potenza" decimale.Eseguo un'operazione, diciamo sottrazione, e poi restituisco il risultato alla potenza originale.

Il mio codice (so che sembra una schifezza, ci ho scherzato tutta la notte):

$val1 = 12.01;
$val2 = 11.01;

translateBTC($val1, $val1T, $val1Pow);
translateBTC($val2, $val2T, $val2Pow);
echo "Subtracing $val1 - $val2\n";
echo "Val1 = $val1T, power = $val1Pow\n";
echo "Val2 = $val2T, power = $val2Pow\n";

subtractBTC($val1T, $val1Pow, $val2T, $val2Pow, $res, $resP);
echo "Result = $res\n";

function translateBTC($btc, &$val, &$pow)
{
    $v1Str  = (string) $btc;
    $v1DPos = strpos($v1Str, '.');

    $v1Int = '';
    $v1Last = 0;
    for($i=0;$i<strlen($v1Str);$i++)
    {
        if ($v1Str[$i] != '.')
        {
            $v1Int .= $v1Str[$i];
        }

        if ($seen)
        {
            if ($v1Str[$i] != 0)
                $v1Last = $i;                
        }

        if ($v1Str[$i] == '.')
        {
            // Were now tracking past the ., so pow.
            $seen = TRUE;
        }
    }

    $val = (int) $v1Int;
    $pow = $v1Last - $v1DPos;
}

function subtractBTC($val1, $val1P, $val2, $val2P, &$result, &$rPow)
{
    $highP = ($val1P > $val2P)? $val1P : $val2P;
    $lowP  = ($val1P < $val2P)? $val1P : $val2P;
    $pStr  = str_pad('', ($highP - $lowP), '0');
    $val2 .= ($val1 > $val2)? $pStr : '';
    $val1 .= ($val2 > $val1)? $pStr : '';

    $val1 = (int)$val1;
    $val2 = (int)$val2;

    echo "val1($val1) - val2($val2)\n";

    $tmpResult = $val1 - $val2;
    $rPow   = $highP;

    $tmpResult = (string) $tmpResult;
    echo "tmpResult = ($tmpResult), rPow = $rPow\n";
    ...

A questo punto, sto lottando per riconvertire il risultato nella base corretta, per tutti i diversi valori ... devo fare tutto in modo sbagliato - esiste un tipo di valuta che posso usare perquesto tipo di precisione?

Ecco l'output di debug:

Val1 = 1201, power = 2
Val2 = 1101, power = 2
val1(1201) - val2(1101)
tmpResult = (100), rPow = 2
001Result = 10.0

TIA SO!

È stato utile?

Soluzione

Guarda nell ' estensione BC Math che ti consente di operare su arbitrarinumeri di precisione memorizzati come stringhe.

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