首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么sprintf更改打印数字的值?

为什么sprintf更改打印数字的值?
EN

Stack Overflow用户
提问于 2017-02-25 16:44:28
回答 2查看 163关注 0票数 1

为什么要使用以下代码

代码语言:javascript
复制
<?php
$x =965745973615421686;
print $x;
print '<br />';
print sprintf ( '%.0f', $x);

?>

打印错误的结果?

代码语言:javascript
复制
965745973615421686
965745973615421696

这是windows 10 x64上的PHP7.1。产品将是Ubuntu 16.04 32位。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-25 17:16:55

浮点运算很奇怪。浮点数是一串有意义的数字,后面跟一个指数。问题是指数占用了空间,所以(在64位系统中)你只能有53位,这是9.0071993e+15的最大有效值。在这种情况下,你似乎有比这个多2位的数字,这意味着当转换为浮点数时,你的数字将不会有100%的精度。

您需要通过执行以下操作来将其保持为int

代码语言:javascript
复制
print sprintf("%d",$x);
票数 2
EN

Stack Overflow用户

发布于 2017-02-25 17:10:58

您最有可能运行的是32位PHP,因此965745973615421686大于PHP_INT_MAX:

代码语言:javascript
复制
var_dump(PHP_INT_MAX, 965745973615421686);

在64位下,它会打印以下内容:

代码语言:javascript
复制
int(9223372036854775807)
int(965745973615421686)

我目前没有32位PHP设置来比较,但是它会在下面这一行打印一些东西:

代码语言:javascript
复制
int(2147483647)
float(...)

此外,转换为字符串的常规类型使用precision指令,因此小数的数量可以变化,但在sprintf()中,您可以定义所需的确切小数:

代码语言:javascript
复制
ini_set('precision', 20);
var_dump((string)1.1, sprintf('%.1f', 1.1));
代码语言:javascript
复制
string(21) "1.1000000000000000888"
string(3) "1.1"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42453863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档