Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift NumberFormatter返回错误的号码_Swift_Numbers_Formatter - Fatal编程技术网

Swift NumberFormatter返回错误的号码

Swift NumberFormatter返回错误的号码,swift,numbers,formatter,Swift,Numbers,Formatter,我测试数字格式以从priceWithCurrency获得数字 如果价格大于70美元,则格式转换错误的数字 惰性变量currencyFormatter:NumberFormatter={ let formatter=NumberFormatter() formatter.numberStyle=.currency formatter.currencyCode=“USD” 返回格式化程序 }() let price=“$71.9” currencyFormatter.编号(价格) //71.9000

我测试数字格式以从priceWithCurrency获得数字

如果价格大于70美元,则格式转换错误的数字

惰性变量currencyFormatter:NumberFormatter={
let formatter=NumberFormatter()
formatter.numberStyle=.currency
formatter.currencyCode=“USD”
返回格式化程序
}()
let price=“$71.9”
currencyFormatter.编号(价格)
//71.90000000000001

如果您对71.8执行相同的操作,它将正常工作。这只是因为71.9不能用浮点数精确表示(由于位的有限性)

使用整数(价格单位为美分)或十进制数字是正确处理价格的唯一问题。检查
decimalnumber
NSDecimalNumber
类,查看可以对其执行哪些操作

特别建议您对价格进行一些计算,(如果您与两位朋友以现金支付10美元,两位朋友将支付3.33美元,一位朋友将支付3.34美元-因此,根据您的上下文,除以3可能不够)

let number=currencyFormatter.number(from:price)??NSNumber(值:0)
var值=数字。小数点
var roundedValue:Decimal=0
//正确的方法:(在此处选择精度-3位小数):
NSDecimalRound(&roundedValue,&value,3,.bankers)
打印(数字)
打印(值)
打印(舍入值)
如果您只需要记录价格,只需使用
Int(price*100)/100
它会成功的

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

编辑

在@Nicholas Rees的精彩评论之后,我添加了以下变化:

currencyFormatter.generatesDecimalNumbers=true
让number=(currencyFormatter.number(from:price)作为?NSDecimalNumber)??NSDecimalNumber(值:0)
var值=数字。小数点
var roundedValue:Decimal=0
//正确的方法:(在此处选择精度-3位小数):
NSDecimalRound(&roundedValue,&value,3,.bankers)
打印(数字)
打印(值)
打印(舍入值)
在这里,记录时的结果是相同的,但我认为“value”的内部格式是正确的

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

print(Decimal(string: "71.9") ?? 0)

71.9

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

使用整数(价格单位为美分)或十进制数字是正确处理价格的唯一问题。检查
decimalnumber
NSDecimalNumber
类,查看可以对其执行哪些操作

特别建议您对价格进行一些计算,(如果您与两位朋友以现金支付10美元,两位朋友将支付3.33美元,一位朋友将支付3.34美元-因此,根据您的上下文,除以3可能不够)

let number=currencyFormatter.number(from:price)??NSNumber(值:0)
var值=数字。小数点
var roundedValue:Decimal=0
//正确的方法:(在此处选择精度-3位小数):
NSDecimalRound(&roundedValue,&value,3,.bankers)
打印(数字)
打印(值)
打印(舍入值)
如果您只需要记录价格,只需使用
Int(price*100)/100
它会成功的

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

编辑

在@Nicholas Rees的精彩评论之后,我添加了以下变化:

currencyFormatter.generatesDecimalNumbers=true
让number=(currencyFormatter.number(from:price)作为?NSDecimalNumber)??NSDecimalNumber(值:0)
var值=数字。小数点
var roundedValue:Decimal=0
//正确的方法:(在此处选择精度-3位小数):
NSDecimalRound(&roundedValue,&value,3,.bankers)
打印(数字)
打印(值)
打印(舍入值)
在这里,记录时的结果是相同的,但我认为“value”的内部格式是正确的

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

print(Decimal(string: "71.9") ?? 0)

71.9

Related:Related:首先将其解析为float是否有时会将其表示为错误的数字?我原以为把它直接解析成十进制是唯一安全的方法。你说得对。我增加了更多的案例。但是,如果我是对的,不要忘记双精度值的实际误差大约是指数-1000。记录时的错误是由于显示前的舍入,但在内部,它并不重要。所以计算是正确的,除非你有几十亿美元要计算:)-无论如何,你得到了一个分数。啦啦队-普通数字的精度为2^-53(根据)谢谢!苹果提供了一个默认为currencyFormatter.generatesDecimalNumbers=false的货币格式化程序,这让我目瞪口呆。首先将其解析为浮点数,有时会将其表示为错误的数字吗?我原以为把它直接解析成十进制是唯一安全的方法。你说得对。我增加了更多的案例。但是,如果我是对的,不要忘记双精度值的实际误差大约是指数-1000。记录时的错误是由于显示前的舍入,但在内部,它并不重要。所以计算是正确的,除非你有几十亿美元要计算:)-无论如何,你得到了一个分数。啦啦队-普通数字的精度为2^-53(根据)谢谢!苹果提供了一个默认为currencyFormatter.generatesDecimalNumbers=false的货币格式化程序,这让我目瞪口呆。