引子
略
总结:
- double 精度问题的本质是二进制位无法存储完整的小数,会导致循环。
当 double 或者 float 作为容器时,就必定会出现精度丢失的问题,无论是 iOS、Java 都会出现:
精度丢失但是不同系统底层处理不同,可能会导致现象不同,比如 Java 中 double 在计算之后才可能出问题,未计算之前,基本不会出问题,这里大概就是底层做了处理:
java
比如 780.06 在 iOS 中赋值时就出问题了。
- double 精度问题会导致数值略微扩大或者缩小,但是对于一般的场景够用。
因为 double 转化成字符串时会自动进行四舍五入。而这个四舍五入如果不进行控制(%.xf),就是 6 位,所以并不会存在什么问题。一般场景下, 6 位精度绝对够用,不够用的情况下,把 %.xf 中的 x 设置到 10 以内都问题不大。而 float 也因为精度不准确,可能在三四位就出问题了,所以 double 比 float 更为理想;
- 如果 double 参与计算又涉及到四舍五入,则需要特别注意。
因为数值略少的情况下,780.01 会变成 780.00999999xx 。如果这个时候,增加了 0.005,就变成了 780.01499999xx ,而此时如果刚好对 3 位精度进行四舍五入,第三位小数刚好是 4 ,最终就会变成 780.01,而实际应该是 780.01 + 0.005 = 780.015,四舍五入应该是 780.02。所以就出现了较大偏差。
即:double 类型在计算之后进行四舍五入时,需要特别注意!!!
- 大小判断时一定要保证单位一样,即 double 和 double 比较,float 和 float 比较。
当精度出现丢失,但是只要源数据是一样的,精度丢失之后的数值也是一样的,所以只需要保证单位一致即可,也就是说,错也要错的一样:
例子:
单位不一样时判断失效:
单位不一致
单位一致,即使精度丢失,结果也正确:
单位一致
网友评论