在我的iOS swift应用程序中,我从web收到一些json,其中包含一些表示货币的双精度值。它看起来是这样的:
[{"Amount": 5.0},{"Amount":-26.07},{"Amount": 4}, ...etc]我将这些值转换为Double,然后尝试将这些值作为Swift "Double“提供给NSDecimalNumber的构造函数,如下所示:
let amount = NSDecimalNumber(double: amountAsDouble)我遇到了这种方法的问题,因为我创建的NSDecimalNumber经常会包含一个不同的数字,小数点后16位。
let amount = NSDecimalNumber(double: -15.97)
println(amount)这将返回-15.970000000000004096
我不想要这个,我要-15.97。谢谢,
发布于 2015-04-02 05:22:28
我最近亲身经历了这一切。我最终使用了一个NSNumberFormatter来获得正确的小数位。
let currFormatter = NSNumberFormatter()
currFormatter.numberStyle = .DecimalStyle
currFormatter.roundingIncrement = 0.01
currFormatter.minimumFractionDigits = 2
currFormatter.maximumFractionDigits = 2
let doubleAmount = currFormatter.numberFromString(amountAsDouble) as NSNumber!
let amount = doubleAmount as Double
println(amount)发布于 2015-04-02 05:29:46
这里有一个提示:如果您使用NSJSONSerializer,带小数点的数字实际上会转换为NSDecimalNumber。NSDecimalNumber是NSNumber的一个子类。所以您要做的是:您已经得到了一个非常好的NSDecimalNumber,将值舍入为double,然后尝试将double转换回NSDecimalNumber。只需检查您所拥有的是否确实是NSDecimalNumber,如果是,请不要进行转换。
发布于 2015-04-02 05:39:51
Double是用18位十进制数字存储的,你对此无能为力,这就是它的工作方式。
点击此处阅读:http://en.wikipedia.org/wiki/Double-precision_floating-point_format
但是,在屏幕上显示该值时,您可以像这样使用NSNumberFormatter:
let amountInDouble: Double = -15.970000000000004096
let formatter = NSNumberFormatter()
formatter.numberStyle = .DecimalStyle
formatter.roundingIncrement = 0.01
formatter.maximumFractionDigits = 2
let amountAsString = formatter.stringFromNumber(NSNumber(double: amountInDouble))
if let amountAsString = amountAsString {
println(amountAsString) // -15.97
}https://stackoverflow.com/questions/28569649
复制相似问题