NumberFormatter字符串(from:NSNumber)方法的小数位数有问题

时间:2018-11-12 07:03:03

标签: ios swift decimal nsnumberformatter nsdecimalnumber

这是我的代码

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")

字符串转换将值取整。 有人可以解释一下这是怎么回事吗?

当我想显示精确数字时,字符串转换将小数点后四舍五入。

2 个答案:

答案 0 :(得分:0)

使用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

答案 1 :(得分:0)

您正在跌落十进制行为的期望与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编译器在过程中的某个位置使用二进制浮点...)