String 到 Double 转换在 Swift 中失去精度
String to Double conversion loses precision in Swift
我想将一个字符串转换为两倍并保持相同的值:
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 作为 Double ??
更新:
即使转换后四舍五入似乎也不起作用
我不想打印,我想计算,重要的是数字应该正确,这是货币计算和汇率
首先:你没有!您在这里遇到的情况称为浮点不准确。计算机无法精确存储每个数字。 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))
}
我想将一个字符串转换为两倍并保持相同的值:
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 作为 Double ??
更新:
即使转换后四舍五入似乎也不起作用
我不想打印,我想计算,重要的是数字应该正确,这是货币计算和汇率
首先:你没有!您在这里遇到的情况称为浮点不准确。计算机无法精确存储每个数字。 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))
}