这是我的代码
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")
字符串转换将值取整。 有人可以解释一下这是怎么回事吗?
当我想显示精确数字时,字符串转换将小数点后四舍五入。
答案 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)
您正在跌落十进制行为的期望与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编译器在过程中的某个位置使用二进制浮点...)