NSDecimalNumber和货币 - 斯威夫特

时间:2018-02-05 23:09:20

标签: ios swift currency nsdecimalnumber

我已经阅读了很多NSDecimalNumber是使用货币时使用的最佳格式。

但是,我仍然遇到浮点问题。

例如。

let a: NSDecimalNumber = 0.07 //0.07000000000000003
let b: NSDecimalNumber = 7.dividing(by: 100) //0.06999999999999999

我知道我可以使用Decimal而b就是我所期待的:

let b: Decimal = 7 / 100 //0.07

我在我的应用中使用Core Data。所以我被NSDecimalNumber困住了。除非我想将很多NSDecimalNumbers转换为Decimals

有人可以帮助我获得0.07吗?

1 个答案:

答案 0 :(得分:4)

问题是你正在有效地进行浮点数学运算(它有忠实地捕捉Double中的小数十进制值的问题)并从中创建NSDecimalNumber / Decimal已经引入此差异的Double值。相反,您希望在进行划分之前(或者在具有小数NSDecimalNumber值之前创建Decimal / Double值,即使是文字也是如此。

因此,以下内容等同于您的示例,即它正在构建Double表示0.07表示(包含所需的限制),并且您最终得到的值不完全正确{ {1}}:

0.07

虽然这不会遇到这个问题,因为我们将小数let value = NSDecimalNumber(value: 7.0 / 100.0) // or Decimal(7.0 / 100.0) 除以小数7

100

或者,在此过程中创建let value = NSDecimalNumber(value: 7).dividing(by: 100) // or Decimal(7) / Decimal(100) 值但避免0.07的其他方法包括使用字符串:

Double

或指定尾数/有效数和指数:

let value = NSDecimalNumber(string: "0.07")                                // or Decimal(string: "0.07")

在使用let value = NSDecimalNumber(mantissa: 7, exponent: -2, isNegative: false) // Decimal(sign: .plus, exponent: -2, significand: 7) 和/或Double时,完全避免使用NSDecimalNumber表示,并且您不会遇到您所描述的问题。