Php 短跑四舍五入

Php 短跑四舍五入,php,Php,为什么下列情况会产生不同的结果 echo 2.55 * 100; echo sprintf(' %d', 2.55 * 100); 输出: 255 254 因为基2固定大小表示法中的2.55*100不是整数,%d不舍入: var_dump(sprintf('%d', 1.99)); 字符串(1)“1” float(254.9999999997158) 与printf()不同,echo$numeric\u变量没有从字符串转换为数字的专用机制。它仅使用转换为字符串,因此它与(string)

为什么下列情况会产生不同的结果

echo 2.55 * 100;
echo sprintf(' %d', 2.55 * 100);
输出:

255 254

因为基2固定大小表示法中的
2.55*100
不是整数,
%d
不舍入:

var_dump(sprintf('%d', 1.99));
字符串(1)“1”
float(254.9999999997158)
printf()
不同,
echo$numeric\u变量
没有从字符串转换为数字的专用机制。它仅使用转换为字符串,因此它与
(string)$numeric\u variable
strval($numeric\u variable)
相同。在这种情况下:

  • 由于变量类型为
    float
    ,它试图表示一个float(这意味着从二进制IEEE 754转换为十进制)
  • 它读取指令以微调表示:

    以浮点数显示的有效位数<代码>-1表示将使用增强的算法对这些数字进行四舍五入


为了减少IEEE 754到十进制转换中的错误,根据需要进行字符串转换。在我的电脑中,默认的
精度
14
,非常接近9的数字。

@MarkBaker这不是他的问题的起点。可能重复@Xatenev请注意有许多9。您依赖于默认精度(
ini_get('precision')
);刚刚意识到我的错误+1.
ini_set('precision', 20);
var_dump(2.55 * 100);