Php “怎么可能?”;“圆形”;还浮球?

Php “怎么可能?”;“圆形”;还浮球?,php,Php,PHP浮点类型是IEEE-754二进制64 数字59.95不能精确地存储在二进制中。在IEEE-754二进制64中,59.95的表示应为59.95000000000000284217094304040074348449703125 然而,当我 <?php return 59.95 PHP通过precisionini设置控制浮点到字符串的精度。默认情况下,此值为14 如果您改为使用32或其他任意较大的值,您将看到您要查找的内容: > php -d "precision=

PHP浮点类型是IEEE-754二进制64

数字59.95不能精确地存储在二进制中。在IEEE-754二进制64中,
59.95
的表示应为
59.95000000000000284217094304040074348449703125

然而,当我

<?php 

return 59.95

PHP通过
precision
ini设置控制浮点到字符串的精度。默认情况下,此值为
14

如果您改为使用
32
或其他任意较大的值,您将看到您要查找的内容:

> php -d "precision=32" -r "print(59.95);"
59.950000000000002842170943040401
                ^-- Default precision stops here
由于与“精确”值的偏差发生在默认精度值之后,因此该值按您可能期望的方式打印:

> php -d "precision=14" -r "print(59.95);"
59.95

除了答案之外:

调试时,有时不希望以标准精度输出。使用printf(和sprintf等)和您想要的位数可以非常容易地做到这一点:

<?php
$float = 59.59;
printf("%0.30e",$float);
//5.959000000000000341060513164848e+1

这是有道理的。同样,现在四舍五入(59.59,2)返回59.59000000000003410605131648480892181396484375。谢谢重要的是要记住,这两种情况下返回的值是相同的;当您更改
精度时,它的打印方式会有所不同。