首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NumberFormatter返回错误的数字

NumberFormatter返回错误的数字
EN

Stack Overflow用户
提问于 2021-02-28 18:49:37
回答 1查看 63关注 0票数 0

我测试NumberFormatter以从priceWithCurrency获取数字。

如果价格大于70美元,NumberFormatter会转换错误的数字。

代码语言:javascript
复制
lazy var currencyFormatter: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.numberStyle = .currency
        formatter.currencyCode = "USD"
        return formatter
}()


let price = "$71.9"

currencyFormatter.number(price)
//71.90000000000001
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-28 21:59:00

如果你用71.8做同样的事情,它将会工作。这只是因为71.9不能用浮点数精确表示(由于位的有限性)

使用整数(以美分为单位的价格)或十进制数字是正确处理价格的唯一问题。检查

类,看看您能用它做些什么。

如果你对价格做了一些计算,特别推荐这样做(如果你用现金支付10美元,两个朋友支付3.33,一个朋友支付3.34 -所以根据你的情况,除以3可能不够)

代码语言:javascript
复制
let number = currencyFormatter.number(from: price) ?? NSNumber(value: 0)
var value =  number.decimalValue
var roundedValue: Decimal = 0

// Right way: ( choose your precisions - 3 decimals here):
NSDecimalRound(&roundedValue, &value, 3, .bankers)

print(number)
print(value)
print(roundedValue)
代码语言:javascript
复制
71.90000000000001
71.90000000000001
71.9

如果您只需要记录价格,只需使用

它可以完成这项工作

如果你需要更多...祝你好运:)

编辑

在@Nicholas Rees的精彩评论之后,我添加了这个变体:

代码语言:javascript
复制
currencyFormatter.generatesDecimalNumbers = true

let number = (currencyFormatter.number(from: price) as? NSDecimalNumber) ?? NSDecimalNumber(value: 0)
var value =  number.decimalValue
var roundedValue: Decimal = 0

// Right way: ( choose your precisions - 3 decimals here):
NSDecimalRound(&roundedValue, &value, 3, .bankers)

print(number)
print(value)
print(roundedValue)

在这里,结果在记录时是相同的,但我认为'value‘的内部格式是正确的

另一种方法是从字符串中删除货币并创建decimal:

代码语言:javascript
复制
print(Decimal(string: "71.9") ?? 0)

71.9
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66408212

复制
相关文章

相似问题

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