4 回答

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

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

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