【发布时间】:2014-09-08 23:57:24
【问题描述】:
澄清:这并不是问我为什么会出现舍入错误。我理解这是一个错误或疏忽。问题询问为什么它在第一个 var_dump 中完整打印,但强制转换就像 57916.9repeating 并截断所说的 .9repeating。
会发生以下情况:
您取一个包含值 579.17 的字符串(或浮点数 - 无关紧要)并将其乘以 100。它 var_dumps 预期的 57917。不是 57916.999999999999999999999999 或类似的值。在我看来,var_dump 不应该将任何东西作为调试功能四舍五入。它可能必须截断,但在调试函数中舍入是意外的。
但是,如果随后将其转换为整数,您会从 var_dump 中得到一个意外的 57916。
我知道浮点数的问题,但是在 PHP 中转换一个精确打印为 57917 的浮点数的行为显然有效地减去了 1。这是一个非常小的数字。
这似乎只发生在某些数字上,例如 579.17。我测试过的其他人不会发生这种情况。我们所做的只是将一个数字乘以 100 以发送到需要美分的 API。 API 库可以理解地转换为整数,因为 API 不接受小数美分。
测试用例:
php -r '$n = ("579.17" * 100); var_dump($n, (int)$n);'
输出:
float(57917)
int(57916)
环境:
x86-32,
x86-64 both.
【问题讨论】:
-
谢谢。我知道这样的浮点怪事。我不明白的是 var_dump 打印 57917,而不是像 57916.999999999999999999999999999 这样的奇怪东西。当我施放它时,它似乎是。没有什么要求 var_dump 进行舍入。我永远不会期望 var_dump 舍入任何东西。就像小数一样,FP 不能代表所有内容,这是代码中将美元+美分更改为美分的疏忽,但我发现这种确切的情况令人费解,因为它在演员表之后打印出来就好像它是完整的一样。
标签: php debugging floating-point