为什么php将这个数字四舍五入?

时间:2019-12-10 17:41:04

标签: php

我有一个应用程序可以通过地址获取以太坊余额。该应用程序从API接收余额,然后将其放入数据库。余额以十六进制整数表示:

$balance = $response->getBody(); //0x1e1e83d93bb6ebb88bbaf

然后将其转换为WEI整数:

$hexInt = BC::hexdec($balance); // WEI "2275742359981542120930223"

然后我需要将WEI转换为ETH:

return $balance / '1000000000000000000';

如果进行计算,它将为2275742.359981542120930223,但是PHP会将其转换为2275742.3599815。如您所见,php将除法后的数字四舍五入。为什么?而我怎样才能得到正确的结果呢?

2 个答案:

答案 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');