为什么以下产生不同的结果?
echo 2.55 * 100;
echo sprintf(' %d', 2.55 * 100);
输出:
255 254
答案 0 :(得分:3)
因为基数2固定大小表示中的2.55 * 100
不是整数而%d
不是圆的:
var_dump(sprintf('%d', 1.99));
string(1) "1"
ini_set('precision', 20);
var_dump(2.55 * 100);
float(254.99999999999997158)
与printf()
不同,echo $numeric_variable
没有专门的机制来从字符串转换为数字。它仅使用default rules转换为字符串,因此它与(string)$numeric_variable
或strval($numeric_variable)
相同。在这种情况下:
float
,它会尝试表示浮点数(这意味着从二进制IEEE 754转换为十进制)。它读取precision指令以微调表示:
浮点数中显示的有效位数。
-1
表示将使用用于舍入此类数字的增强算法。
要将IEEE 754中的错误减少为十进制转换,请根据需要进行字符串转换。在我的计算机中,默认precision
为14
,这与9的数量非常接近。