如何在 NSDecimalNumber 中存储 1.66

Posted

技术标签:

【中文标题】如何在 NSDecimalNumber 中存储 1.66【英文标题】:How to store 1.66 in NSDecimalNumber 【发布时间】:2017-03-14 09:09:29 【问题描述】:

我知道 float 或 double 不适合存储货币和数量等十进制数。我正在尝试改用 NSDecimalNumber。这是我在 Swift 操场上的代码。

let number:NSDecimalNumber = 1.66
let text:String = String(describing: number)
NSLog(text)

控制台输出为 1.6599999999999995904

如何将十进制数 1.66 的准确值存储在变量中?

【问题讨论】:

看看这个。 ***.com/a/31070910/2975371 谢谢@Danieboy。我是新来的。你能提供我如何将 1.66 精确存储在变量中的示例代码吗? 【参考方案1】:

let number:NSDecimalNumber = 1.66

右边是浮点数,不能表示 值“1.66”正好。一种选择是创建十进制数 来自一个字符串:

let number = NSDecimalNumber(string: "1.66")
print(number) // 1.66

另一种选择是使用算术:

let number = NSDecimalNumber(value: 166).dividing(by: 100)
print(number) // 1.66

在 Swift 3 中,您可以考虑改用“覆盖值类型”Decimal,例如

let num = Decimal(166)/Decimal(100)
print(num) // 1.66

另一种选择:

let num = Decimal(sign: .plus, exponent: -2, significand: 166)
print(num) // 1.66

附录:

Swift 论坛中的相关讨论:

Exact NSDecimalNumber via literal ExpressibleByFractionLiteral

相关错误报告:

SR-3317 Literal protocol for decimal literals should support precise decimal accuracy,作为副本关闭 SR-920 Re-design builtin compiler protocols for literal convertible types。

【讨论】:

以上是关于如何在 NSDecimalNumber 中存储 1.66的主要内容,如果未能解决你的问题,请参考以下文章

使用 numberFromString 生成 NSDecimalNumber 时如何在没有分数错误的情况下获得舍入值?

如果 NSDecimalNumber 大于 Uint64,如何将 NSDecimalNumber 转换为字节数组?

如何在不损失精度的情况下解码 NSDecimalNumber?

NSDecimalNumber 的数学完整性

将 NSString 转换为 NSDecimalNumber

NSDecimalNumber 如何判断是不是有小数部分