【问题标题】:NumberFormatter string(from:NSNumber) method has issues with decimal placesNumberFormatter string(from:NSNumber) 方法有小数位问题
【发布时间】: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 的声明和推断类型(如果它不明确)?

标签: ios swift decimal nsnumberformatter nsdecimalnumber


【解决方案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
猜你喜欢
  • 1970-01-01
  • 2014-09-03
  • 2011-09-03
  • 1970-01-01
  • 2018-01-15
  • 2018-07-01
  • 2010-10-29
  • 1970-01-01
  • 2011-04-20
相关资源
最近更新 更多