我编写了一个用于计算货币的基本程序。如果我将函数的数据类型切换为浮点型。如果我将初始值设置为16.16,便士的计数是不正确的。如果我将其切换为双精度,它将对其进行更正。我不确定为什么会这样。我知道double更为精确,但我认为这不会影响我的程序。
import UIKit
func moneyCounter(initialValue: Double) -> Array<Any> {
var money = initialValue
func countsTypesOfMoney(moneyValue: Double) -> String {
var moneyTypeAmmount = 0
while money >= moneyValue {
money -= moneyValue
moneyTypeAmmount += 1
}
return String(moneyTypeAmmount)
}
return ["$" + String(initialValue) + " = " + countsTypesOfMoney(moneyValue: 1.00) + "
dollars + " + countsTypesOfMoney(moneyValue: 0.25) + " quarters + " +
countsTypesOfMoney(moneyValue: 0.10) + " dimes + " + countsTypesOfMoney(moneyValue: 0.05) +
" nickels + " + countsTypesOfMoney(moneyValue: 0.01) + " pennies"]
}
print(moneyCounter(initialValue: 16.16))
在计算单个项目时,使用浮点数或双精度数确实是一个糟糕的选择。浮点数和双精度数都可能不精确。我见过的时候我的值为0.8,我从中减去0.2,得到0.60000002。您还可能会得到0.59999998或一些类似的稍微偏离的值,如果您要截断它,就像在countTypesOfMoney方法中所做的那样,由于舍入错误,您会从60美分变为59美分。
最好只寄几美分或几分钱就可以了。
import UIKit
func moneyCounter(initialCents: Int) -> Array<Any> {
var money = initialValue
func countsTypesOfMoney(moneyValue: Int) -> String {
var moneyTypeAmount = 0
while money >= moneyValue {
money -= moneyValue
moneyTypeAmount += 1
}
return String(moneyTypeAmount)
}
return ["$" + String(initialValue) + " = " + countsTypesOfMoney(moneyValue: 1.00) + "
dollars + " + countsTypesOfMoney(moneyValue: 0.25) + " quarters + " +
countsTypesOfMoney(moneyValue: 0.10) + " dimes + " + countsTypesOfMoney(moneyValue: 0.05) +
" nickels + " + countsTypesOfMoney(moneyValue: 0.01) + " pennies"]
print(moneyCounter(initialCents: 1616))
如果需要输入十进制版本,例如从用户输入中输入,我会带入一个字符串并将其解析为十进制并将其转换为便士。如果这是用于一些愚蠢的学校作业,并且您需要像这样继续使用花车或双打,则应四舍五入到最后的一分钱。
此外,我还将使用%函数来获取不同的面额。