在PHP中,我知道我们不应该在没有bcmath之类的东西上对数学进行数学,但仅仅是投射一个字符串浮动破坏性的行为?
像(float)'5.111' == '5.111'
这样的表达式总是如此吗?或者,当转换数字时,演员本身会将其更改为5.1110000000000199837
之类的内容吗?
主要原因是,就像我使用(int)
来转义进入数据库的整数值一样,我想以同样的方式使用(float)
,而不必依赖引号和逃脱功能
答案 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