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(这意味着从二进制IEEE 754转换为十进制)float
- 它读取指令以微调表示: 以浮点数显示的有效位数<代码>-1表示将使用增强的算法对这些数字进行四舍五入
为了减少IEEE 754到十进制转换中的错误,根据需要进行字符串转换。在我的电脑中,默认的
精度
为14
,非常接近9的数字。@MarkBaker这不是他的问题的起点。可能重复@Xatenev请注意有许多9。您依赖于默认精度(ini_get('precision')
);刚刚意识到我的错误+1.
ini_set('precision', 20);
var_dump(2.55 * 100);