解决php使用intval将浮点数转成整型时出现精度失真的问题

发布于2020-09-06 | 1559 阅读 | 1 喜欢 | php intval

最近在写一个抽奖功能时出现了将浮点数转成整型时出现了精度失真的问题 问题复现:

$test = 1.14;
echo $test * 100;//打印浮点数
echo '<br/>';
echo intval($test *100);//将浮点数转化成整型

打印出来的信息为:

114
113

如上就出现了精度失真的问题了,那么如何解决上面的问题呢?可以通过以下方式解决

1、将浮点数转成字符型然后再转为整型
$test = 1.14;
echo $test * 100;//打印浮点数
echo '<br/>';
echo intval(strval($test * 100));//将浮点数转成字符串型然后转成整型

打印出来的信息为:

114
114
使用高精度函数实现
$test = 1.14;
echo $test * 100;//打印浮点数
echo '<br/>';
echo bcmul($test,  100);//使用高精度函数bcmul实现将参数一乘以参数二

打印出来的信息为:

114
114

其他常见的高精度函数有:

bcadd — 将两个高精度数字相加

bcsub — 将两个高精度数字相减

bcmul — 将两个高精度数字相乘

bcdiv — 将两个高精度数字相除

bccomp — 比较两个高精度数字,返回-1, 0, 1

bcmod — 求高精度数字余数

bcpow — 求高精度数字乘方

bcpowmod — 求高精度数字乘方求模,数论里非常常用

bcscale — 配置默认小数点位数,相当于就是Linux bc中的”scale=”

bcsqrt — 求高精度数字平方根