我有一个应用程序可以通过地址获取以太坊余额。该应用程序从API接收余额,然后将其放入数据库。余额以十六进制整数表示:
$balance = $response->getBody(); //0x1e1e83d93bb6ebb88bbaf
然后将其转换为WEI整数:
$hexInt = BC::hexdec($balance); // WEI "2275742359981542120930223"
然后我需要将WEI转换为ETH:
return $balance / '1000000000000000000';
如果进行计算,它将为2275742.359981542120930223
,但是PHP会将其转换为2275742.3599815
。如您所见,php将除法后的数字四舍五入。为什么?而我怎样才能得到正确的结果呢?
答案 0 :(得分:1)
发生这种情况是由于隐式强制转换。除法返回浮点数。浮点数不是精确值。他们有精度。您可以使用number_format()
指定输出的小数位数/精度,但是浮点数可能无法提供必要的精度。这里是ini options。
一种解决方案是使用bcdiv()
以期望的精度。或者,您可以使用字符串函数编写自己的格式设置方法:
$balance = '2275742359981542120930223';
$result = $balance / '1000000000000000000';
var_dump($result);
var_dump(number_format($result, 18, '.', ''));
var_dump(bcdiv($balance, '1000000000000000000', 18));
function formatETH(string $value, int $factor = 18) {
return substr($value, 0, -$factor).'.'.substr($value, -$factor);
}
var_dump(formatETH($balance));
输出:
float(2275742.3599815)
string(26) "2275742.359981541987508535"
string(26) "2275742.359981542120930223"
string(26) "2275742.359981542120930223"
答案 1 :(得分:0)
由于您处理大数并使用https://github.com/krowinski/bcmath-extended,因此可以使用BC函数进行除法。扩展的bcmath有一个包装器(bcdiv),因此请尝试:
return BC::div($balance, '1000000000000000000');