提问人:Shawn Sandhu 提问时间:3/25/2020 更新时间:3/25/2020 访问量:43
在 swift 中,double 和 float 之间有区别吗?[复制]
In swift is there a difference between a double and a float? [duplicate]
问:
我写了一个计算钱的基本程序。如果我将函数的数据类型切换为浮点数。如果我将初始值设置为 16.16,则便士计数不正确。如果我将其切换到双倍,它会纠正它。我不确定为什么会这样。我知道双精度更高,但我认为这不会影响我的程序。
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赞
HalR
3/25/2020
#1
在计算单个项目时,使用浮点数或双精度确实是一个糟糕的选择。float 和 double 都可能不精确。我见过我的值为 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))
如果您需要输入十进制版本,例如从用户输入,我会引入一个字符串并解析十进制并将其转换为便士。如果这是为了一些愚蠢的学校作业,并且您需要继续使用这样的浮动或双打,您应该在最后四舍五入到最接近的一分钱。
此外,我会使用 % 函数来获取不同的面额。
评论
0赞
Shawn Sandhu
3/25/2020
非常感谢您的回答。为什么浮点数和双打数不精确?
0赞
HalR
3/25/2020
这个问题有一些很好的答案: stackoverflow.com/q/3730019/793607
上一个:与浮子和双精度相关的概念
评论