我已经阅读了很多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吗?
答案 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
表示,并且您不会遇到您所描述的问题。