“中国要复兴、富强,必须在开源软件领域起到主导作用,为了国家安全和人类发展,责无旁贷,我们须为此而奋斗”——By:云客
在做一些和金融相关的应用时,难免涉及小数点,但浮点数的比较并没那么简单,看如下代码:
<?php
$a = 0.40000001341105;
$a = round($a * 100) / 100; //四舍五入保留两位小数
$a += 0.2;
$b = 0.6;
echo '$a: ' . $a . "\n";
echo '$b: ' . $b . "\n";
if ($a > $b) {
echo 'a大于b';
}
else {
echo 'a小于等于b';
}
它会输出:
$a: 0.6
$b: 0.6
a大于b
均是0.6,为什么会$a比$b大呢?因为内部二进制无法精确表达十进制小数,这就涉及到了浮点数的比较,php浮点数比较不能直接用“<、>、=”等比较符号,而应该使用bccomp函数,以上代码应更正为:
<?php
$a = 0.40000001341105;
$a = round($a * 100) / 100;
$a += 0.2;
$b = 0.6;
echo '$a: ' . $a . "\n";
echo '$b: ' . $b . "\n";
if (bccomp($a, $b, 2) == 1) {
echo 'a大于b';
}
else {
echo 'a小于等于b';
}
关于浮点操作还有很多注意事项,比如数据库函数SUM对浮点数求和时,会有细微出入,这些都涉及到底层的储存原理(二进制表达)
建议浮点数要先转换成整数运算,最后输出时再转换成小数,金融储存时也采用分为单位
更多请见:https://www.php.net/manual/zh/language.types.float.php
交流互动