PHP中如何精确处理高精度浮点数计算问题?

2026-04-02 05:280阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1471个文字,预计阅读时间需要6分钟。

PHP中如何精确处理高精度浮点数计算问题?

php

PHP

var_dump(intval(0.58 * 100));

正确结果是 57,而不是 58

浮点运算惹的祸

其实这些结果都并非语言的 bug,但和语言的实现原理有关, js 所有数字统一为 Number, 包括整形实际上全都是双精度(double)类型。

而PHP会区分 int 还是 float。不管什么语言,只要涉及浮点运算,都是存在类似的问题,使用时一定要注意。

说明:如果用php的+-*/计算浮点数的时候,可能会遇到一些计算结果错误的问题,比如上面 的 echo intval( 0.58*100 );会打印57,而不是58,这个其实是计算机底层二进制无法精确表示浮点数的一个bug,是跨语言的,我用python也遇到这个问题。所以基本上大部 分语言都提供了精准计算的类库或函数库,比如php有BC高精确度函数库,稍后我绍一下一些常用的BC高精确度函数使用。

还是回到上面的57,58问题。

为啥输出是57啊? PHP的bug么?

要搞明白这个原因, 首先我们要知道浮点数的表示(IEEE 754):

  • 浮点数, 以64位的长度(双精度)为例, 会采用1位符号位(E), 11指数位(Q), 52位尾数(M)表示(一共64位).
  • 符号位:最高位表示数据的正负,0表示正数,1表示负数。
阅读全文

本文共计1471个文字,预计阅读时间需要6分钟。

PHP中如何精确处理高精度浮点数计算问题?

php

PHP

var_dump(intval(0.58 * 100));

正确结果是 57,而不是 58

浮点运算惹的祸

其实这些结果都并非语言的 bug,但和语言的实现原理有关, js 所有数字统一为 Number, 包括整形实际上全都是双精度(double)类型。

而PHP会区分 int 还是 float。不管什么语言,只要涉及浮点运算,都是存在类似的问题,使用时一定要注意。

说明:如果用php的+-*/计算浮点数的时候,可能会遇到一些计算结果错误的问题,比如上面 的 echo intval( 0.58*100 );会打印57,而不是58,这个其实是计算机底层二进制无法精确表示浮点数的一个bug,是跨语言的,我用python也遇到这个问题。所以基本上大部 分语言都提供了精准计算的类库或函数库,比如php有BC高精确度函数库,稍后我绍一下一些常用的BC高精确度函数使用。

还是回到上面的57,58问题。

为啥输出是57啊? PHP的bug么?

要搞明白这个原因, 首先我们要知道浮点数的表示(IEEE 754):

  • 浮点数, 以64位的长度(双精度)为例, 会采用1位符号位(E), 11指数位(Q), 52位尾数(M)表示(一共64位).
  • 符号位:最高位表示数据的正负,0表示正数,1表示负数。
阅读全文