php浮点计算2小数点

Shi*_*iro 22 php floating-point decimal rounding

再次得到另一个数学计算问题.

$a = 34.56

$b = 34.55
Run Code Online (Sandbox Code Playgroud)

$a 得到一些计算来得到这个数字

$b 得到这个数字的四舍五入最接近0.05

会发生什么

$c = $b - $a
Run Code Online (Sandbox Code Playgroud)

据说我应该是-0.01,但我回应的$c是显示-0.00988888888888

我尝试使用n number_format($c, 2),但输出为0.00,

我怎样才能确定$a并且$b正好是2位小数,后面没有隐藏号码.

在我的PHP知识number_format只能格式化显示,但值不是真正的2十进制,

我希望我能从这里得到帮助.这让我很沮丧.

Cha*_* Ma 50

尝试 sprintf("%.2f", $c);

浮点数用IEEE表示法表示,基于2的幂,因此终止十进制数可能不是终止二进制数,这就是你获得尾随数字的原因.

正如可变长度编码器所建议的那样,如果你知道你想要的精度并且它没有改变(例如当你处理钱时),最好只使用定点数,即将数字表示为美分而不是美元

$a = 3456;

$b = 3455;

$c = $b - $a;

sprintf ("%.2f", $c/100.0);
Run Code Online (Sandbox Code Playgroud)

这样,如果在打印前进行大量计算,则不会出现任何舍入错误.


cle*_*tus 15

用途round():

$c = round($b - $a, 2);
Run Code Online (Sandbox Code Playgroud)

注意:您也可以根据需要选择舍入模式.

编辑:好的我不知道那sprintf()是做什么的number_format()不是:

$c = number_format($b - $a, 2);
Run Code Online (Sandbox Code Playgroud)

VS

$c = sprintf("%.2f", $b - $a);
Run Code Online (Sandbox Code Playgroud)


Var*_*der 6

您遇到了浮点数的陷阱之一;它们不能总是代表精确的小数。如果您想要精确的十进制值,最好使用整数,然后除以最后所需的精度。

例如,如果您正在以代表美元(或您最喜欢的货币)的浮点数进行计算,您可能希望实际以整数美分进行计算。


Rob*_*t L 5

只需使用 bcmath 库,您就可以非常巧妙地回避所有这些问题。

请记住阅读文档并小心您是否将参数作为字符串或数字数据类型传递。


小智 5

本机计算:

$a = 34.56;
$b = 34.55;
$c = $b - $a; // -0.010000000000005    
Run Code Online (Sandbox Code Playgroud)

按预期工作(!始终使用 BC 函数进行实数计算,该问题适用于所有基于 C 的平台):

$a = '34.56';
$b = '34.55';
$c = bcsub($b, $a, 4); // -0.0100    
Run Code Online (Sandbox Code Playgroud)