1
carity 2021-02-19 14:36:00 +08:00
浮点精度问题
|
2
fengpan567 2021-02-19 14:56:06 +08:00
转成整数进行计算
|
3
joesonw 2021-02-19 14:57:53 +08:00
|
4
eastphoton 2021-02-19 15:00:53 +08:00
日经了。十进制下的有限小数可能是二进制下的无限循环小数,存不了。
0.2D=0.00110011B 无限循环,从浮点可存储位数截断后变成 0.19xxx 不允许误差不要用浮点。 |
5
mrgeneral 2021-02-19 15:03:38 +08:00
> 以十进制能够精确表示的有理数如 0.1 或 0.7,无论有多少尾数都不能被内部所使用的二进制精确表示,因此不能在不丢失一点点精度的情况下转换为二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999999991118...。
如果确实需要更高的精度,应该使用 BC 或者 GMP 。 |
6
debuggerx 2021-02-19 15:04:02 +08:00
round()
|
7
zhengwenk 2021-02-19 16:13:00 +08:00
var_dump(157.2 * 100)
float(15720) 157.2*100 === 15720 false |
8
Jooooooooo 2021-02-20 00:00:09 +08:00
有些十进制看起来可以表达, 其实二进制表达不了.
|
9
Rache1 2021-02-20 09:21:31 +08:00
换成 BC Math 方法。
bcmul('157.2',100,0) |