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