PHP 使用 Ceil 对浮点值进行四舍五入,结果比较并不像它必须的那样
PHP Rounding Float Values With Ceil And Result Comparison Is Not As It Must Be
我有一个PHP函数作为
function func(){
function round_up($value, $decPlaces) {
return ceil($value * pow(10, $decPlaces)) / pow(10, $decPlaces);
}
$a=21.31;
$b=2;
$c=10.64;
$d=0.03;
$xxx=$a;
$yyy=round_up($b*$c,2)+round_up($d,2);
$zzz=($xxx===$yyy);
var_dump($xxx,$yyy,$zzz);
}
这个函数输出
float(21.31) float(21.31) bool(false)
好像xxx等于yyy但是为什么zzz是假的?这个函数和结果的问题在哪里?
只需将最后一行更改为此即可查看区别:
var_dump(number_format($xxx, 20), number_format($yyy, 20), $zzz);
以下是有关该问题的一些有用信息:
https://secure.php.net/manual/en/language.types.float.php
https://andy-carter.com/blog/don-t-trust-php-floating-point-numbers-when-equating
还有更多...:)
我有一个PHP函数作为
function func(){
function round_up($value, $decPlaces) {
return ceil($value * pow(10, $decPlaces)) / pow(10, $decPlaces);
}
$a=21.31;
$b=2;
$c=10.64;
$d=0.03;
$xxx=$a;
$yyy=round_up($b*$c,2)+round_up($d,2);
$zzz=($xxx===$yyy);
var_dump($xxx,$yyy,$zzz);
}
这个函数输出
float(21.31) float(21.31) bool(false)
好像xxx等于yyy但是为什么zzz是假的?这个函数和结果的问题在哪里?
只需将最后一行更改为此即可查看区别:
var_dump(number_format($xxx, 20), number_format($yyy, 20), $zzz);
以下是有关该问题的一些有用信息:
https://secure.php.net/manual/en/language.types.float.php
https://andy-carter.com/blog/don-t-trust-php-floating-point-numbers-when-equating
还有更多...:)