例如,由于浮点舍入误差,我知道0.1是不正确的,但是,我还有另一个问题:是
$num=floatval('0.1');
完全等于
$num=1/10
?上面的2个$ num最终会舍入到相同的值吗?
或者通常是
$num=floatval('a.bc');
完全等于
$num=abc/100;
(哪个abc是数字,而abc是整数)?
答案 0 :(得分:0)
据我所知,PHP没有官方标准。 Such documentation as there is未完全指定floating-point操作的语义。它没有指定必须使用哪种浮点表示形式或格式实现。
也就是说,浮点运算的优良作法是产生结果的运算,就好像首先使用无限精确的算术(精确数学)计算结果,然后根据有效的舍入规则将其舍入。 (通常,使用的规则是四舍五入到最接近的可表示值,并且将位数四舍五入到具有较低位数的较近值。)
如果使用该规则,则将十进制数字 a.bc 转换为浮点的操作应产生与将数字 abc 除以完全相同的结果100。这是因为将 a.bc 解释为十进制的精确数学结果等于将 abc 除以100的精确数学结果,因此它们在产生之前都完全相同四舍五入,四舍五入应将它们四舍五入到相同的可表示值。
在某些编程语言(例如C和C ++)中,允许对浮点表达式进行比标称类型更精确的求值,并且允许对浮点表达式进行收缩,这意味着可以将多个操作组合为一个在数学上等效的操作。
前者的一个示例是,编程语言实现可能使用double
来对名义上为float
类型的值进行算术运算。如果使用PHP实现,那么 a.bc 可能实际上具有与 abc / 100不同的值,因为一个精度是float
,而另一个精度是以double
精度进行计算。如果使用C或C ++实现特定的PHP实现,则精度会发生变化,因为底层的C或C ++实现会按照C和C ++标准进行操作。
后者的一个示例是,在计算a*b + c
时,某些C或C ++实现可能会选择使用产生结果的指令,就像a*b + c
是用精确数学完全计算出来然后四舍五入的一样到最接近的可表示值,而不是先计算a*b
并四舍五入,然后将c
添加到四舍五入的结果中并进行第二次四舍五入。我还没有迹象表明PHP实现可以做到这一点。但是,如果这样做,那么在某些情况下,如果将。 abc 解释为十进制数字,并且将 abc 除以100,则可能会出现不同的结果。使用或与其他操作结合使用。
请注意,如果实现使用额外的精度和/或收缩,则问题不仅仅在于 a.bc 的值可能与 abc / 100的值不同。 abc / 100表达式在不同情况下可能看起来与其自身具有不同的值,因为实现在不同情况下可能使用不同的精度。