快速和浮点数之间有区别吗?

问题描述 投票:-2回答:1

我编写了一个用于计算货币的基本程序。如果我将函数的数据类型切换为浮点型。如果我将初始值设置为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))
swift double floating-accuracy
1个回答
0
投票

在计算单个项目时,使用浮点数或双精度数确实是一个糟糕的选择。浮点数和双精度数都可能不精确。我见过的时候我的值为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))

如果需要输入十进制版本,例如从用户输入中输入,我会带入一个字符串并将其解析为十进制并将其转换为便士。如果这是用于一些愚蠢的学校作业,并且您需要像这样继续使用花车或双打,则应四舍五入到最后的一分钱。

此外,我还将使用%函数来获取不同的面额。

© www.soinside.com 2019 - 2024. All rights reserved.