繁体   English   中英

PHP四舍五入时精度不正确

[英]PHP incorrect precision while rounding off number

我需要舍入一些数字并获得修改价值。

我试过了:

$Num=12.456;
$RoundDiff=$Num-round($Num,2);
$Num=round($Num,2);
echo $Num.'<br/>'.$RoundDiff;

但我有:

12.46
-0.0040000000000013

而我的预期结果是:

12.46
-0.004

怎么了?
我如何获得所需的东西?

尝试下面的代码。 它会给您预期的结果。 我已将差额四舍五入。

$Num       = 12.456;
$RoundDiff = $Num-round($Num,2);
$Num       = round($Num,2);
echo $Num.'<br/>'.round($RoundDiff,3);

键盘

浮点值的精度存在问题。 请参阅本文以供参考- 默认情况下,PHP浮点精度不正确

如果需要精确的精度,可以使用bcmathgmp

因为在内部,计算机使用的格式(二进制浮点数)根本无法准确表示一个数字,例如0.1、0.2或0.3。

编译或解释代码时,“ 0.1”已经舍入为该格式的最接近的数字,即使在计算之前,也会产生小的舍入误差。 —浮点指南

另一个参考:

鉴于(正常)IEEE 754双精度数字的隐式精度略小于16位数字3 ,这是一个严重的过大杀伤力。 换句话说,尾数由52位加1个隐含位组成,而100个十进制数字最多可以承载100 * log2(10)=〜332位信息,约为6倍。

鉴于此,我建议将默认精度更改为17(虽然精度略低于16,但第17位是必需的,因为第一个十进制数字在较低时几乎没有信息)。 - 资源

BCMATH: 按评论要求

$a = 12.456;
$b = round($a,2);
echo 'a ='.$a.'<br>';
echo 'b ='.$b.'<br>';
echo bcsub($a, $b, 3);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM