在Swift中,将字符串转换为双精度浮点数会丢失精度

6
我想将一个字符串转换为double类型并保持相同的值:
let myStr = "2.40"
let numberFormatter = NSNumberFormatter()
numberFormatter.locale = NSLocale(localeIdentifier: "fr_FR")
let myDouble = numberFormatter.numberFromString(myStr)?.doubleValue ?? 0.0

myDouble现在是

Double? 2.3999999999999999

如何将“2.40”转换为精确的Double类型的2.40呢?

更新:

即使在转换后进行四舍五入也似乎不起作用。

我不想打印,我想计算,重要的是数字应该正确,这是货币计算和利率。


http://floating-point-gui.de/ - Eric Aya
可能是为什么浮点数不准确?的重复问题。 - Ben
强制类型转换。 let myStr = "2.40" print(Double(myStr) - Indrajit Chavda
@IndrajitChavda https://www.evernote.com/l/AOwWmGytgsRKl7gBAjFt6euVig3GBQMaNsY - Eric Aya
请查看此处:http://postimg.org/image/3zx9hcec1/ - Indrajit Chavda
显示剩余6条评论
1个回答

8
首先:你不需要!你遇到的问题被称为浮点数不准确性。计算机无法精确存储每个数字。2.4 不能在浮点类型中无损存储。
其次:由于浮点数始终是一个问题,而且你正在处理货币(我猜你正在尝试存储2.4瑞士法郎),你的首要解决方案是:不使用浮点数。使用从 numberFromString 得到的 NSNumber,不要试图将其转换为 Double
或者通过乘法移动逗号并将其存储为 Int
第一种解决方案可能如下所示:
if let num = myDouble {
    let value = NSDecimalNumber(decimal: num.decimalValue)
    let output = value.decimalNumberByMultiplyingBy(NSDecimalNumber(integer: 10))
}

有趣的答案,基本上我会将转换后的数字相乘并相加,然后显示带有2位小数精度的数字,如何使用NSNumber实现? - iOSGeek
1
@iOSGeek 对于延迟的回复,我表示抱歉:我稍微编辑了一下我的答案,添加了一个小代码片段,演示了一些计算。显示值与浮点精度问题完全没有关系。对于显示值,您可以四舍五入,或让NSNumber来处理显示,它将希望正确地显示数字。 - luk2302

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接