铸造浮动是破坏性的吗?

时间:2011-01-10 17:00:34

标签: php floating-point escaping floating-accuracy

在PHP中,我知道我们不应该在没有bcmath之类的东西上对数学进行数学,但仅仅是投射一个字符串浮动破坏性的行为?

(float)'5.111' == '5.111'这样的表达式总是如此吗?或者,当转换数字时,演员本身会将其更改为5.1110000000000199837之类的内容吗?

主要原因是,就像我使用(int)来转义进入数据库的整数值一样,我想以同样的方式使用(float),而不必依赖引号和逃脱功能

3 个答案:

答案 0 :(得分:1)

您不应该使用(int)来转义整数值。使用参数化查询并将输入类型设置为“int”。一个更好的方法!

对于mysql / php中的示例,请参阅: http://us.php.net/manual/en/mysqli.prepare.php

答案 1 :(得分:1)

这取决于小数部分是否可以用二进制表示(参见Fractions in binary)。例如,0.5具有精确的二进制表示,但0.1没有。如果数字没有精确的表示,则再次打印时可能会看到不同的结果。

答案 2 :(得分:1)

没有,投射到浮动几乎总是具有破坏性。

在您的示例中,以二进制表示的5.111是:

101.00011100011010100111111011111001110110110010001011010000111001...

浮点数将存储23位数字:

101.0001110001101010011 
(5.1109981536865234375)

双人将存储52位数字:

101.0001110001101010011111101111100111011011001000101
(5.1109999999999988773424774990417063236236572265625)

在这种情况下,没有区别。但是,数量越多,它就会影响您显示的内容。

例如:

<强> 1025.4995

双:

10000000001.011111111101111100111011011001000101101
(1025.499499999999898136593401432037353515625)

浮动:

10000000001.011111111101
(1025.499267578125)

你可以看到大约8位后精度开始急剧下降。

双倍将转为 1025.4995 ,而浮动将 1025.4993