前言

前段时间项目里,涉及到付出相关,后端Java兄弟过来特别找iOS端的咱们问了一个问题:咱们后端用BigDecimal类型的数据类型,iOS端能够接住吗?

因为安卓和后端都是用的Java编写,所以没有什么压力,不过iOS端是Swift编写的,所以特别过来咨询了一下?

我那会想都没想,说至少能够用Double接住吧?

后端的兄弟接着问:能够保证付出时分的计算精度吗?

那一刹那我傻了。

Double与Float计算时遇到的困境

我现在playground来一段代码:

Swift:使用 Decimal 接受金额并进行计算

true还是false

假如根据经历,一定会说是true吧,当然假如略微有点编程经历,都知道这是一个坑爹问题。咱们看看运转成果吧:

Swift:使用 Decimal 接受金额并进行计算

没错,走的是false,为什么?

这里不得不提一下精度问题:

浮点数字面量在代码中是无限位的,ExpressibleByFloatLiteral运用init(floatLiteral:)初始化时总会发生精度丢失。

横竖,在代码中这些数字并不是即见即所得,我们必须要留一个心眼。

尽管都Double类型去接住JSON的里面的数据没有问题,用于展示数据到App界面上也没有问题,不过,一旦要运用这些数据进行计算,就必须考虑运用其他类型。

咱们能够看看一个完好的playground的示例:

Swift:使用 Decimal 接受金额并进行计算

那咱们遇到这种情况究竟应该运用什么类型去接数据呢?

不知道到我们是否了解OC时代的NSDecimal?

运用 Decimal 表明金额

Decimal是能够精确表明以 10 为底数字的类型。在 Swift 中,Foundation 结构提供了桥接到NSDecimalNumber类的Decimal类型(它本身包装了NSDecimal结构和相关函数)。

你不用像操作DoubleFloat值那样担心Decimal值相加可能会得到古怪的成果。

咱们将上面的playground例子,将数据类型显式声明一下,再来看看运转成果:

Swift:使用 Decimal 接受金额并进行计算

一切都看起来正常了,契合逻辑,也契合预期。

我们假如感兴趣,能够自己点进去,看看这个Decimal类:

Swift:使用 Decimal 接受金额并进行计算

这里,我提供的Decimal的应用场景,只是它很小一起也是很常见的运用例子,更多的运用场景,我们能够挖掘,或者在某些场景出现问题的时分,能回想起这篇文章,就能够了。

总结

小问题上的细节,可能会导致App在运转中的各种bug。

这篇文章只是一篇经历谈,但愿能够协助到各位就好。

自己写的项目,欢迎我们star⭐️

RxStudy:RxSwift/RxCocoa结构,MVVM模式编写wanandroid客户端。

GetXStudy:运用GetX,重构了Flutter wanandroid客户端。