有人能告诉我为什么会发生这种事吗?
let formatter = NumberFormatter.init()
formatter.numberStyle = .decimal
formatter.usesGroupingSeparator = false
formatter.roundingMode = .floor
formatter.minimumFractionDigits = 2
formatter.maximumFractionDigits = 2
let v = 36
let scale = 10
let float = formatter.string(from: NSNumber(value: Float(v) / Float(scale)))!
let double = formatter.string(from: NSNumber(value: Double(v) / Double(scale)))!
print(float) // 3.59
print(double) // 3.60
当我使用Float
时,结果是3.59 (在我看来是错误的结果),当我使用Double
时,结果是3.60。
我知道这与.floor
roundingMode有关,但我不完全理解原因。
发布于 2022-03-09 17:16:32
如果您希望保持分数位的精度,最好使用Swift本机十进制类型。就是这样。您可以使用十进制init(sign: FloatingPointSign, exponent: Int, significand: Decimal)
初始化,并使用您的标度指数和值的意义。只需确保否定它的价值:
extension SignedInteger {
var negated: Self { self * -1 }
}
let v = 36
let scale = 10
let sign: FloatingPointSign = v >= 0 ? .plus : .minus
let exponent = Decimal(scale).exponent.negated
let significand = Decimal(v).significand
let decimal = Decimal.init(sign: sign, exponent: exponent, significand: significand)
let formatted = formatter.string(for: decimal) // "3.60"
https://stackoverflow.com/questions/71411824
复制相似问题