Pregunta

Tengo un problema, je.Estoy haciendo algunos cálculos con bitcoins en PHP.Cuando llamo a la API, recupero JSON con valores de bitcoin.Son cadenas con una precisión de 1 millonésima de decimal.

Los estaba rastreando como flotantes en mi aplicación, pero eso genera muchos problemas de precisión y pérdidas.

Entonces, decidí traducir cada cadena a un número entero y almacenar la "potencia" decimal.Realizo una operación, digo resta y luego devuelvo el resultado a su poder original.

Mi código (sé que parece una mierda, he estado jugando con esto toda la noche):

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

En este punto, estoy luchando para volver a convertir el resultado a la base adecuada, para todos los valores diferentes ... Tengo que estar haciendo todo mal, ¿hay algún tipo de moneda que pueda usar paraeste tipo de precisión?

Aquí está el resultado de la depuración:

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

¡TIA SO!

¿Fue útil?

Solución

Busque en la extensión BC Math que le permite operar ennúmeros de precisión almacenados como cadenas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top