4 回答
TA贡献1796条经验 获得超4个赞
因此,您将在这里遇到两个问题。首先是浮点数一般缺乏精度,其次是 PHP 在你有机会使用类似bcdiv.
因此:第一步是将输入数字存储为字符串,这样解析器将它们解释为浮点数时就不会丢失精度。然后用bcdiv在他们身上。
由于您就在整数部分之后,并且 bcdiv 在成功时返回一个字符串,因此我们可以使用字符串函数删除小数部分。
<?php
$valueArr = [
// should return 1999
'199.90',
'199.92',
'199.95',
'199.97',
// should return 2000
'200.00',
'200.02',
'200.05',
'200.07',
// should return 2001
'200.10',
'200.12',
'200.15',
'200.17',
'381736192374124241.294',
];
$denominator = '0.1';
$resultArr = [];
foreach ($valueArr as $value) {
$key = (string) $value;
$result = explode('.', bcdiv($value, $denominator))[0];
$resultArr[$key] = $result;
}
echo "Denominator:\n";
var_dump($denominator);
echo "\n";
print_r($resultArr);
TA贡献2012条经验 获得超12个赞
我使用 bcdiv() 得到了正确的结果。
$result = bcdiv($value,$denominator);
我总是使用 BcMath,对我来说似乎更可靠。
TA贡献1826条经验 获得超6个赞
如果您没有扩展bcdiv
附带的,BcMath
您可以使用sprintf()函数通过Floor()获得正确的结果,即使分母是小于 的浮点数,也没有任何问题0.0001
。
代替:
$result = floor($value / $denominator);
用这个:
$result = floor(sprintf('%f', $value / $denominator));
你会得到正确的:
[200.1] => 2001
TA贡献1804条经验 获得超3个赞
你没有做错任何事。这是电脑的问题。在固定的空间内准确地表示浮点数是很困难的。
尝试这个
foreach ($valueArr as $v) { $resultArr []= floor($v * (1 / $denominator)); }
我的建议是尝试将除法运算转换为乘法运算。
在你的例子中,除以 0.1 === 乘以 10。所以,使用它。
- 4 回答
- 0 关注
- 127 浏览
添加回答
举报