字符串到双转换损失精度在斯威夫特

问题描述:

我想隐蔽字符串倍增,并保持相同的值:字符串到双转换损失精度在斯威夫特

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”到确实是2.40双倍?

更新:

转换后,即使四舍五入似乎不工作

我不想打印,我想计算和数字应该是正确是很重要的,它的钱计算和费率

+0

http://floating-point-gui.de/ – Moritz

+0

我是知道的,但我想[为什么是浮点的解决方案 – iOSGeek

+0

可能的复制数字不准确?](http://*.com/questions/21895756/why-are-floating-point-numbers-incucurate) – Ben

首先:你不!你在这里遇到的是所谓的浮点不准确。计算机无法精确存储每个数字。 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)) 
} 
+0

有趣的答案,基本上我会乘以转换的数字彼此和他们然后我会显示具有2浮点精度的数字,如何与NSNumbe做到这一点r? – iOSGeek

+1

@iOSGeek对于延迟响应抱歉:我稍微编辑了我的答案,以包含一些代码片断,它演示了一些计算。显示该值与浮点精度问题完全分离。为了显示值,你可以舍入数值或者让'NSNumber'处理显示器,希望*能正确显示数字。 – luk2302