首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NSNumberFormatter和.floor roundingMode

NSNumberFormatter和.floor roundingMode
EN

Stack Overflow用户
提问于 2022-03-09 15:27:35
回答 1查看 125关注 0票数 0

有人能告诉我为什么会发生这种事吗?

代码语言:javascript
运行
复制
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有关,但我不完全理解原因。

EN

回答 1

Stack Overflow用户

发布于 2022-03-09 17:16:32

如果您希望保持分数位的精度,最好使用Swift本机十进制类型。就是这样。您可以使用十进制init(sign: FloatingPointSign, exponent: Int, significand: Decimal)初始化,并使用您的标度指数和值的意义。只需确保否定它的价值:

代码语言:javascript
运行
复制
extension SignedInteger {
    var negated: Self { self * -1 }
}

代码语言:javascript
运行
复制
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"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71411824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档