Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.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
Ios 我使用哪种Swift数据类型作为货币_Ios_Swift - Fatal编程技术网

Ios 我使用哪种Swift数据类型作为货币

Ios 我使用哪种Swift数据类型作为货币,ios,swift,Ios,Swift,我有一个iOS应用程序,它将对表示美元货币的数字(例如25.00表示25.00美元)执行许多基本的算术运算 我在Java和Javascript等其他语言中使用数据类型Double时遇到了很多麻烦,因此我想知道Swift中货币使用的最佳数据类型 我建议您从一个typealias开始。例如: typealias Dollars = Decimal let a = Dollars(123456) let b = Dollars(1000) let c = a / b print(c) 输出: 123

我有一个iOS应用程序,它将对表示美元货币的数字(例如25.00表示25.00美元)执行许多基本的算术运算


我在Java和Javascript等其他语言中使用数据类型Double时遇到了很多麻烦,因此我想知道Swift中货币使用的最佳数据类型

我建议您从一个
typealias
开始。例如:

typealias Dollars = Decimal
let a = Dollars(123456)
let b = Dollars(1000)
let c = a / b
print(c)
输出:

123.456

有一个非常好的库叫做:

除此之外,还有很多不错的功能,例如类型安全货币:

let euros: EUR = 100
let dollars: USD = 1500
euros + dollars //Error
二进制运算符“+”不能应用于类型为“EUR”(又名“u Money”)和“USD”(又名“u Money”)的操作数

使用,并确保正确初始化它

对的

//从双精度开始初始化十进制:
让monetaryAmountAsDouble=32.111
设decimal:decimal=NSNumber(floatLiteral:32.111).decimalValue
print(decimal)//32.111对于一个充满资金的项目来说,这可能是最好的选择

在中,@mattt为简单的货币类型提供了一个很好的解决方案:

struct Money {
    enum Currency: String {
      case USD, EUR, GBP, CNY // supported currencies here
    }

    var amount: Decimal
    var currency: Currency
}

《飞行学校Swift数字指南》中的第3章为本主题提供了极好的介绍。

我们使用这种方法,将
货币
作为预先生成的巨大枚举(不要忘记货币值只是一个没有货币的数字-它们都属于一起):


只是好奇,当使用double作为货币的数据类型时,您遇到了什么样的问题?@AbhishekMukherjee我在比较值时遇到了问题。当我认为5.20==5.20时,实际上是5.20000001==5.20,这已经被讨论了很多。在Java中使用的正确类型是BigDecimal。对于我的项目,我最初将货币金额存储为
Int
(将美元金额乘以100进行存储,然后将其反转,并在访问时转换为
Double
),在实施了一个多货币系统,其中货币具有不同的小数位数,跟踪它是存储的
Int
还是访问的
Double
金额,以及它是原始货币还是基础货币后,
Int
方法的开销过大。当使用
Double
时,数学更容易,但最后我还建议使用
NSDecimalNumber
@userx。我发现使用Double时存在的问题是,仅仅相减会导致非常长的浮点值,我不知道为什么。例如,像650.50-300.50这样简单的东西会导致350.0038420489380933,我不知道为什么。这种方法是否保持小数点后的位数?或者它会创建一个小数点的近似值,可以延伸许多超过小数点的数字?我最喜欢这种方法,因为它感觉最容易使用。为什么不创建一个货币类?这是一个可怕的货币解决方案,因为用
双精度
初始化
十进制
很容易导致舍入错误。例如:
Decimal(2.13)=2.12999999999488
我的答案不建议将
Double
转换为
Decimal
。我的答案显示了如何通过除以10的幂来准确创建小数位数的
十进制数。此类警告:它不符合NSCoding,这意味着您将无法使用NSCoder保存Money类型的值。Xcode将抛出错误。感谢您展示了正确的初始化方法。您是否可以显示将
十进制
转换回
字符串
的正确方法?我不确定StackOverflow的其他答案是否正确。使用Decimal(floatLiteral:)是否等于使用NSNumber(floatLiteral:)。decimalValue?@Roberto无论出于何种原因,Decimal(floatLiteral:)生成的结果不正确(32.110999999988)。
struct Money {
    enum Currency: String {
      case USD, EUR, GBP, CNY // supported currencies here
    }

    var amount: Decimal
    var currency: Currency
}
struct Money: Hashable, Equatable {

    let value: Decimal
    let currency: Currency
}

extension Money {

    var string: String {
        CurrencyFormatter.shared.string(from: self)
    }
}