为什么php会舍入这个数字?

为什么php会舍入这个数字?,php,Php,我有一个通过地址获取以太坊余额的应用程序。应用程序从API接收余额,然后将其放入数据库。余额为十六进制整数: $balance = $response->getBody(); //0x1e1e83d93bb6ebb88bbaf $hexInt = BC::hexdec($balance); // WEI "2275742359981542120930223" 然后我将其转换为整数: $hexInt = BC::hexdec($balance); // WEI "227574235998

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

$balance = $response->getBody(); //0x1e1e83d93bb6ebb88bbaf
$hexInt = BC::hexdec($balance); // WEI "2275742359981542120930223"
然后我将其转换为整数:

$hexInt = BC::hexdec($balance); // WEI "2275742359981542120930223"
然后我需要把魏转换成以太:

return $balance / '1000000000000000000';

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

这是由于隐式强制转换造成的。除法返回一个浮点数。浮动不是精确的值。它们很精确。您可以使用
number\u format()
指定输出的小数/精度,但浮点可能无法提供必要的精度。给你

一种解决方案是以预期的精度使用
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"

由于您处理的是大数字,并且使用BC函数可以进行除法。bcmath extended有一个包装器(bcdiv),因此请尝试:


试着把它放在脚本的开头
ini_set('precision',32);//您的精度也可能是,BC::hexdec中的BC是多少?似乎您可能希望对您的除法使用bcdiv()之类的BC函数?@khartnett是的,这是它没有将值舍入到
2275742.3599815
,它只显示如下。如果无法使用浮点标准表示该值,它可能仍然会将其舍入到与您期望的值不同的值。是的,已经对其进行了测试。但这不是我需要的。如果我需要在这里找到正确的号码,我该怎么办?在这里: