工程项目中,需要注意浮点数的点
- 不能有 == 比较
- 上下游注意nan值检查
计算机对浮点的表示和运算的特点
二进制表示
- 部分十进制小数转化为二进制小数后,是无限循环小数,比如 0.05 转换为二进制 0.000011001100110011001100110011…… 如果截断,实际计算机存储的是 0.049999999999
IEEE 754 标准下的浮点
- 小数位数是精确的
- 有效位数是有限的
计算机做浮点运算的陷阱和缺陷
- 丢失精度,近似比较不准确
正确的比较方法 : if (a - b < 0.0000001 && a-b > -0.0000001) {}
- 四舍五入,导致误差累积
软件设计时如何保证高精度的计算
使用高精度计算库,比如:
- Java 使用BigInteger 、BigDecimal 类
- PHP 使用bcmath扩展提供的方法
- C/C++ 自行编写高精度算法和数据结构
附录
优秀文档总结:https://gywbd.github.io/posts/2015/9/floating-point-number.html