У меня есть проблема, хе. Я делаю некоторые расчеты с биткойнами в PHP. Когда я вызываю API, я возвращаю JSON со значениями биткойнов. Это строки с точностью до одной миллионной десятичной дроби.
Я отслеживал их как поплавки в своем приложении, но это приводило ко многим проблемам с точностью и потерей.
Итак, я решил перевести каждую строку в целое число и сохранить десятичную "степень". Я выполняю операцию, произношу вычитание, а затем возвращаю результат в исходное состояние.
Мой код (я знаю, что это похоже на дерьмо, я балуюсь этим всю ночь):
$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";
...
На данный момент я пытаюсь преобразовать результат обратно в правильную базу, для всех различных значений ... Я должен идти об этом все неправильно - есть ли тип валюты, который я могу использовать для такого рода точность?
Вот вывод отладки:
Val1 = 1201, power = 2
Val2 = 1101, power = 2
val1(1201) - val2(1101)
tmpResult = (100), rPow = 2
001Result = 10.0
TIA SO!