第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

PHP計算除法的整數(shù)

PHP計算除法的整數(shù)

PHP
尚方寶劍之說 2023-09-08 14:35:02
我想計算除法的整數(shù)部分。分子和分母(尤其是它們的精度)不應更改,因為它可能從一種計算變?yōu)榱硪环N計算,同樣以分母為例,其整數(shù)部分和小數(shù)部分可能不同。我嘗試使用Floor、ceil、round但它們都沒有產(chǎn)生正確的結(jié)果。請看下面的代碼,也許你會發(fā)現(xiàn)錯誤:<?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,];$denominator = 0.1;$resultArr = [];foreach ($valueArr as $value) {    $key = (string) $value;    $result = floor($value / $denominator);    $resultArr[$key] = $result;}echo "Denominator:\n";var_dump($denominator);echo "\n";print_r($resultArr);給出結(jié)果:Denominator:float(0.1)Array(    [199.9] => 1999    [199.92] => 1999    [199.95] => 1999    [199.97] => 1999    [200] => 2000    [200.02] => 2000    [200.05] => 2000    [200.07] => 2000    [200.1] => 2000    [200.12] => 2001    [200.15] => 2001    [200.17] => 2001)在哪里:    [200.1] => 2000是錯誤的,因為 (200.1 / 0.1) 的整數(shù)部分是 200 1。您知道如何為$valueArr上述結(jié)果生成正確的結(jié)果嗎?我做錯了什么?我正在使用 PHP 7.3.8 (cli)
查看完整描述

4 回答

?
SMILET

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);


查看完整回答
反對 回復 2023-09-08
?
繁花如伊

TA貢獻2012條經(jīng)驗 獲得超12個贊

我使用 bcdiv() 得到了正確的結(jié)果。

$result = bcdiv($value,$denominator);

我總是使用 BcMath,對我來說似乎更可靠。


查看完整回答
反對 回復 2023-09-08
?
躍然一笑

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


查看完整回答
反對 回復 2023-09-08
?
狐的傳說

TA貢獻1804條經(jīng)驗 獲得超3個贊

你沒有做錯任何事。這是電腦的問題。在固定的空間內(nèi)準確地表示浮點數(shù)是很困難的。

嘗試這個

foreach ($valueArr as $v) {
    $resultArr []= floor($v * (1 / $denominator));
}

我的建議是嘗試將除法運算轉(zhuǎn)換為乘法運算。

在你的例子中,除以 0.1 === 乘以 10。所以,使用它。


查看完整回答
反對 回復 2023-09-08
  • 4 回答
  • 0 關(guān)注
  • 181 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號