NumberFormatter string(from:NSNumber) 方法有小数位问题
Posted
技术标签:
【中文标题】NumberFormatter string(from:NSNumber) 方法有小数位问题【英文标题】:NumberFormatter string(from:NSNumber) method has issues with decimal places 【发布时间】:2018-11-12 07:03:02 【问题描述】:这是我的代码
let ns = NumberFormatter.init()
ns.allowsFloats = true
ns.maximumFractionDigits = 18 //This is a variable value
ns.minimumFractionDigits = 18 //This is a variable value
ns.roundingMode = .floor
ns.numberStyle = .decimal
let doubleValueOfDecimal : Double = 12.95699999999998
let numb = NSNumber.init(value: doubleValueOfDecimal)
print(numb)
let string = ns.string(from: numb)
print(string)
以下是输出和输入
doubleValueOfDecimal = 2.95699999999998
Output
2.95699999999998
Optional("2.956999999999980000")
但是如果我输入
doubleValueOfDecimal = 12.95699999999998
输出是
12.95699999999998
Optional("12.957000000000000000")
字符串转换对值进行四舍五入。 有人可以解释一下这是如何工作的吗?
当我希望它显示确切的数字时,字符串转换会将小数位四舍五入。
【问题讨论】:
您能否编辑您的问题并添加doubleValueOfDecimal
的声明和推断类型(如果它不明确)?
Is floating point math broken?的可能重复
【参考方案1】:
您正陷入对十进制数字行为的期望与Float
和Double
是二进制浮点的现实之间的裂缝,即是十进制数的小数部分是 1/10、1/100 等的总和。而对于二进制数,它是 1/2、1/4 等的总和,并且一些精确的值在另一个中不精确,反之亦然反之亦然。
更改您的代码以包含:
let doubleValueOfDecimal : Decimal = Decimal(string:"12.95699999999998")!
let numb = doubleValueOfDecimal as NSDecimalNumber
并且输出可能是您所期望的:
12.95699999999998
12.956999999999980000
Decimal
类型是十进制浮点值类型,NSDecimalNumber
是 NSNumber
的子类,其中包含 Decimal
值。
HTH
(注意:您必须从字符串初始化 Decimal
,因为使用数字文字似乎涉及 Swift 编译器在过程中的某个点使用二进制浮点...)
【讨论】:
有点晚了,但才意识到这个答案实际上帮助我解决了问题。感谢 CRD【参考方案2】:使用NSNumber
类的包装方法。 `
print(numb.stringValue)
let ns = NumberFormatter.init()
ns.allowsFloats = true
ns.maximumFractionDigits = 18
ns.minimumFractionDigits = 18
ns.roundingMode = .floor
ns.numberStyle = .decimal
let numb = NSNumber.init(value: doubleValueOfDecimal)
print(numb)
let string = ns.string(from: numb)
print(numb.stringValue)
低于 2.95699999999998 和 12.95699999999998 值的输出。
输出
2.95699999999998
2.95699999999998
12.95699999999998
12.95699999999998
【讨论】:
我使用 NumberFormatter 类是有原因的。 maximumFractionDigits 和 minimumFractionDigits 是变量而不是常量。所以我不能放弃 Formatter 的整个设置并直接使用 stringValue以上是关于NumberFormatter string(from:NSNumber) 方法有小数位问题的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SwiftUI 中使用 NumberFormatter?
PHP 'NumberFormatter' 'SPELLOUT' 没有提供所需的英文格式