4 回答

TA貢獻1796條經(jīng)驗 獲得超4個贊
因此,您將在這里遇到兩個問題。首先是浮點數(shù)一般缺乏精度,其次是 PHP 在你有機會使用類似bcdiv.
因此:第一步是將輸入數(shù)字存儲為字符串,這樣解析器將它們解釋為浮點數(shù)時就不會丟失精度。然后用bcdiv在他們身上。
由于您就在整數(shù)部分之后,并且 bcdiv 在成功時返回一個字符串,因此我們可以使用字符串函數(shù)刪除小數(shù)部分。
<?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條經(jīng)驗 獲得超12個贊
我使用 bcdiv() 得到了正確的結(jié)果。
$result = bcdiv($value,$denominator);
我總是使用 BcMath,對我來說似乎更可靠。

TA貢獻1826條經(jīng)驗 獲得超6個贊
如果您沒有擴展bcdiv
附帶的,BcMath
您可以使用sprintf()函數(shù)通過Floor()獲得正確的結(jié)果,即使分母是小于 的浮點數(shù),也沒有任何問題0.0001
。
代替:
$result?=?floor($value?/?$denominator);
用這個:
$result?=?floor(sprintf('%f',?$value?/?$denominator));
你會得到正確的:
[200.1]?=>?2001

TA貢獻1804條經(jīng)驗 獲得超3個贊
你沒有做錯任何事。這是電腦的問題。在固定的空間內(nèi)準確地表示浮點數(shù)是很困難的。
嘗試這個
foreach ($valueArr as $v) { $resultArr []= floor($v * (1 / $denominator)); }
我的建議是嘗試將除法運算轉(zhuǎn)換為乘法運算。
在你的例子中,除以 0.1 === 乘以 10。所以,使用它。
- 4 回答
- 0 關(guān)注
- 181 瀏覽
添加回答
舉報