NumberFormatter string(from:NSNumber) 方法存在小数位问题

NumberFormatter string(from:NSNumber) method has issues with decimal places

这是我的代码

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

字符串转换将值四舍五入。 有人可以向我解释这是如何工作的吗?

当我希望它显示准确数字时,字符串转换会四舍五入小数位。

使用 NSNumber class 的包装方法。 `

 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)

Below Output for 2.95699999999998 , 12.95699999999998 values.

输出

2.95699999999998

2.95699999999998

12.95699999999998

12.95699999999998

你在 十进制 数字行为的预期与 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 编译器在某些点使用二进制浮点数过程...)