前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP和Python浮点数精度问题

PHP和Python浮点数精度问题

作者头像
用户2475223
发布2019-12-17 15:57:58
9310
发布2019-12-17 15:57:58
举报
文章被收录于专栏:codersamcodersam

浮点数精度问题

下面的代码都是PHP代码,Python的浮点数精度问题可以使用下面同样的方法解决

$i = 0.58;
echo intval($i*100);
// 输出结果 57
:pen:
:pen:

what? 为啥输出了57 针对这个问题,逛了鸟哥的博客。(PHP浮点数的一个常见问题的解答) 主要需要理解的就是在计算机中浮点数转成二进制时是无限长的值。

0.57的二进制表示基本上(52位)是: 0010001111010111000010100011110101110000101000111101
0.58的二进制表示基本上(52位)是: 0010100011110101110000101000111101011100001010001111

浮点数, 以64位的长度(双精度)为例, 会采用1位符号位(E), 11指数位(Q), 52位尾数(M)表示(一共64位). 符号位:最高位表示数据的正负,0表示正数,1表示负数。 指数位:表示数据以2为底的幂,指数采用偏移码表示 尾数:表示数据小数点后的有效数字。 而两者的二进制, 如果只是通过这52位计算的话,分别是:

0.58 -> 0.57999999999999996
0.57 -> 0.56999999999999995

当使用0.58*100的时候实际上是0.57999999999999996*100=57.999999999999996,再使用intval()自然就是57了。 看似有穷的小数在计算机的二进制表示里实际上是无穷的。

解决方案

使用round()函数

$i = 0.58;
echo round($i*100);
// 输出结果 58
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年5月24日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 浮点数精度问题
  • 解决方案
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档