美文网首页
iOS-double的精度问题

iOS-double的精度问题

作者: 康小曹 | 来源:发表于2022-08-19 09:54 被阅读0次

    引子

    总结:

    1. double 精度问题的本质是二进制位无法存储完整的小数,会导致循环。

    当 double 或者 float 作为容器时,就必定会出现精度丢失的问题,无论是 iOS、Java 都会出现:

    精度丢失

    但是不同系统底层处理不同,可能会导致现象不同,比如 Java 中 double 在计算之后才可能出问题,未计算之前,基本不会出问题,这里大概就是底层做了处理:


    java

    比如 780.06 在 iOS 中赋值时就出问题了。

    1. double 精度问题会导致数值略微扩大或者缩小,但是对于一般的场景够用。

    因为 double 转化成字符串时会自动进行四舍五入。而这个四舍五入如果不进行控制(%.xf),就是 6 位,所以并不会存在什么问题。一般场景下, 6 位精度绝对够用,不够用的情况下,把 %.xf 中的 x 设置到 10 以内都问题不大。而 float 也因为精度不准确,可能在三四位就出问题了,所以 double 比 float 更为理想;

    1. 如果 double 参与计算又涉及到四舍五入,则需要特别注意。

    因为数值略少的情况下,780.01 会变成 780.00999999xx 。如果这个时候,增加了 0.005,就变成了 780.01499999xx ,而此时如果刚好对 3 位精度进行四舍五入,第三位小数刚好是 4 ,最终就会变成 780.01,而实际应该是 780.01 + 0.005 = 780.015,四舍五入应该是 780.02。所以就出现了较大偏差。

    即:double 类型在计算之后进行四舍五入时,需要特别注意!!!

    1. 大小判断时一定要保证单位一样,即 double 和 double 比较,float 和 float 比较。

    当精度出现丢失,但是只要源数据是一样的,精度丢失之后的数值也是一样的,所以只需要保证单位一致即可,也就是说,错也要错的一样:

    例子:

    单位不一样时判断失效:


    单位不一致

    单位一致,即使精度丢失,结果也正确:


    单位一致

    相关文章

      网友评论

          本文标题:iOS-double的精度问题

          本文链接:https://www.haomeiwen.com/subject/feiegrtx.html