为什么要使用以下代码
<?php
$x =965745973615421686;
print $x;
print '<br />';
print sprintf ( '%.0f', $x);
?>打印错误的结果?
965745973615421686
965745973615421696这是windows 10 x64上的PHP7.1。产品将是Ubuntu 16.04 32位。
发布于 2017-02-25 17:16:55
浮点运算很奇怪。浮点数是一串有意义的数字,后面跟一个指数。问题是指数占用了空间,所以(在64位系统中)你只能有53位,这是9.0071993e+15的最大有效值。在这种情况下,你似乎有比这个多2位的数字,这意味着当转换为浮点数时,你的数字将不会有100%的精度。
您需要通过执行以下操作来将其保持为int
print sprintf("%d",$x);发布于 2017-02-25 17:10:58
您最有可能运行的是32位PHP,因此965745973615421686大于PHP_INT_MAX:
var_dump(PHP_INT_MAX, 965745973615421686);在64位下,它会打印以下内容:
int(9223372036854775807)
int(965745973615421686)我目前没有32位PHP设置来比较,但是它会在下面这一行打印一些东西:
int(2147483647)
float(...)此外,转换为字符串的常规类型使用precision指令,因此小数的数量可以变化,但在sprintf()中,您可以定义所需的确切小数:
ini_set('precision', 20);
var_dump((string)1.1, sprintf('%.1f', 1.1));string(21) "1.1000000000000000888"
string(3) "1.1"https://stackoverflow.com/questions/42453863
复制相似问题