Frage

Ich habe ein Problem, heh.Ich mache einige Berechnungen mit Bitcoins in PHP.Wenn ich die API aufrufe, erhalte ich JSON mit Bitcoin-Werten zurück.Es handelt sich um Zeichenfolgen mit einer Genauigkeit von 1 Millionstel Dezimalstellen.

Ich habe sie als Floats in meiner App verfolgt, aber das führt zu vielen Präzisionsproblemen und Verlusten.

Also habe ich beschlossen, jede Zeichenfolge in eine Ganzzahl zu übersetzen und die dezimale "Potenz" zu speichern.Ich führe eine Operation durch, z. B. Subtraktion, und kehre dann das Ergebnis zu ihrer ursprünglichen Potenz zurück.

Mein Code (ich weiß, es sieht beschissen aus, ich habe die ganze Nacht damit rumgespielt):

$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";
    ...

An diesem Punkt habe ich Probleme damit, das Ergebnis für all die verschiedenen Werte wieder in die richtige Basis umzuwandeln ... Ich muss das alles falsch machen - gibt es einen Währungstyp, für den ich verwenden kann?diese Art von Präzision?

Hier ist die Debug-Ausgabe:

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

TIA SO!

War es hilfreich?

Lösung

Sehen Sie sich die BC Math-Erweiterung an, mit der Sie beliebig arbeiten könnenPräzisionszahlen, die als Zeichenfolgen gespeichert sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top