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】:

您正陷入对十进制数字行为的期望与FloatDouble二进制浮点的现实之间的裂缝,即是十进制数的小数部分是 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 类型是十进制浮点值类型,NSDecimalNumberNSNumber 的子类,其中包含 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?

numberformatter(样式货币)删除不起作用

NumberFormatter 分组未按预期工作

PHP 'NumberFormatter' 'SPELLOUT' 没有提供所需的英文格式

PHP NumberFormatter.format() 显示奇怪的输出

来自 NumberFormatter 的本地化货币符号