在 swift 中,double 和 float 之间有区别吗?[复制]

In swift is there a difference between a double and a float? [duplicate]

提问人:Shawn Sandhu 提问时间:3/25/2020 更新时间:3/25/2020 访问量:43

问:

我写了一个计算钱的基本程序。如果我将函数的数据类型切换为浮点数。如果我将初始值设置为 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