hive中decimal转换成string_Swift 中如何避免精度丢失

本文探讨了在Swift中遇到浮点型数值精度丢失的问题,以及如何通过使用Decimal类型来解决。介绍了Decimal与NSDecimalNumber的区别,并提供了解决精度丢失的策略,包括在计算中使用Decimal并在需要时转换为字符串,以及使用Codable自定义解码来避免精度损失。
摘要由CSDN通过智能技术生成

c8a04fa1dd4d4a26078287fff41d4293.png

如果你开发过涉及金额计算的 iOS app, 那么你很有可能经历过在使用浮点型数字时精度丢失的问题

07ddb3957f4e7757c316dd6cd58cdb3e.png

让我们来看看为什么会丢失以及如何解决吧

浮点型数字的数值精度为何会丢失?

这里我不想系统地讲解浮点型是如何由基数尾数指数组成的, 直接说原因: 因为用二进制能表示的以 2 为底的指数必然是 2 的倍数, 也就是说只能为 0.5, 0.25, 0.125... 以此类推, 那么我们就可以发现无论将这些数字怎么组合, 都不可能达到 0.3 这个值, 因此计算机这个时候会给我们一个最接近 0.3 且恰好是这些数字之和的一个近似值.

18469936a5029c0b5ad91b8d41a8a468.png

因此, 对于精度丢失我们可以得出如下结论:

  • 在 Swift 里面整数是不会有精度丢失的问题的, 因为整数的跨度为 1, 1 是可以被 2 进制表示出来的
  • 由于 Swift 编程语言存储浮点型的方式问题, 浮点型 (Double/Float) 的精度丢失问题是必然会发生的

数值精度丢失的影响

上面我们简单的解释了为什么会丢失精度, 那么精度丢失对我们在什么时候有影响呢?

根据我的经验, 我认为主要场景集中如下:

  • 在需要将数字以字面值向外界展示的时候
  • 在需要将数字发向服务器进行严格对比 (每一位都不能有差别)

所以, 精度丢失并不可怕 (起码出现的场景很少). 下面让我们看下如何才能在我们真的遇到了精度丢失问题时候进行解决

如何应对数值精度丢失

  1. 计算过程中全程使用 Double, 最后转为字符串
    由于 Swift 在精度丢失时会在保留很多位小数 (比如 0.3 存储为 0.29999999999999999), 这些小数与真实值的差距非常之小, 因此我们完全可以在过程中不对其进行任何操
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值