我测试NumberFormatter以从priceWithCurrency获取数字。
如果价格大于70美元,NumberFormatter会转换错误的数字。
lazy var currencyFormatter: NumberFormatter = {
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.currencyCode = "USD"
return formatter
}()
let price = "$71.9"
currencyFormatter.number(price)
//71.90000000000001发布于 2021-02-28 21:59:00
如果你用71.8做同样的事情,它将会工作。这只是因为71.9不能用浮点数精确表示(由于位的有限性)
使用整数(以美分为单位的价格)或十进制数字是正确处理价格的唯一问题。检查
和
类,看看您能用它做些什么。
如果你对价格做了一些计算,特别推荐这样做(如果你用现金支付10美元,两个朋友支付3.33,一个朋友支付3.34 -所以根据你的情况,除以3可能不够)
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)71.90000000000001
71.90000000000001
71.9如果您只需要记录价格,只需使用
它可以完成这项工作
如果你需要更多...祝你好运:)
编辑
在@Nicholas Rees的精彩评论之后,我添加了这个变体:
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:
print(Decimal(string: "71.9") ?? 0)
71.9https://stackoverflow.com/questions/66408212
复制相似问题