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)
?
您遇到了浮点数的陷阱之一;它们不能总是代表精确的小数。如果您想要精确的十进制值,最好使用整数,然后除以最后所需的精度。
例如,如果您正在以代表美元(或您最喜欢的货币)的浮点数进行计算,您可能希望实际以整数美分进行计算。
小智 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)