如何解决PHP中精度计算问题的详细解析?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1552个文字,预计阅读时间需要7分钟。
PHP中`var_dump(intval(0.58 * 100))`的正确结果是57,而不是58。这是因为浮点数运算存在精度问题,导致结果略有偏差。这并非语言bug,而是与语言的实现原理有关。JavaScript中所有数字系统统一为Number,包括整数实际上也是双精度浮点数。
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问题。
本文共计1552个文字,预计阅读时间需要7分钟。
PHP中`var_dump(intval(0.58 * 100))`的正确结果是57,而不是58。这是因为浮点数运算存在精度问题,导致结果略有偏差。这并非语言bug,而是与语言的实现原理有关。JavaScript中所有数字系统统一为Number,包括整数实际上也是双精度浮点数。
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问题。

