PHP 浮点精度和浮点到字符串/整数转换

问题描述 投票:0回答:1

观察以下情况

php -r 'echo 4.60*100, " ", (int)(4.60*100), PHP_EOL;'

令人惊讶的是(对我来说)它打印了这个:

460 459

我知道十进制 4.60 不能表示为有限的二进制数,但为什么

  • float 4.60 的字符串表示形式打印为 4.60,而不是 4.59...99?
  • 从浮点数 (4.60*100) 进行整数转换最终得到 459 而不是 460?
php floating-point type-conversion
1个回答
0
投票

浏览 PHP 文档,我没有看到浮点格式或将浮点值转换为字符串的格式的严格规范。所以这个答案是为了说明所涉及的一般原则,而不是基于文档的严格规范。

IEEE-754“双精度”(binary64)格式通常用于浮点。在此格式中,最接近 4.6 的可表示值是 4.5999999999999996447286321199499070644378662109375。乘以 100 得到 459.99999999999994315658113919198513031005859375。

执行

echo
会强制从浮点类型转换为字符串。我在文档中没有找到任何具体说明如何执行此转换的内容,但一些实验表明,至少在一种实现中,它是按照 C 格式
%.14g
进行转换的,即使用 14 位有效数字。将 459.99999999999994315658113919198513031005859375 四舍五入到 14 位有效数字得到 460 (“460.00000000000”),这就是显示的输出。

由于 PHP 没有严格指定,您可能会在不同的实现中看到不同的输出。

© www.soinside.com 2019 - 2024. All rights reserved.