【问题标题】:Swift rounding to X decimals places issue when .999999.999999 时快速舍入到 X 小数位
【发布时间】:2018-01-09 09:09:53
【问题描述】:

我确实尝试了不同的舍入到小数位的方法,它们都有相同的共同点。当我使用数字时,假设为 0.99999,我想将其四舍五入到小数点后 2 位。我的预期结果是 0.99,但我得到 1.00

我试过

let divisor = pow(10.0, Double(decimals))
let roundedVal = round(value * divisor) / divisor

也试过了

String(format:"%.2f",decimals)

还有

let behavior = NSDecimalNumberHandler(roundingMode: .plain, scale: decimals, raiseOnExactness: false, raiseOnOverflow: false, raiseOnUnderflow: false, raiseOnDivideByZero: true)

NSDecimalNumber(value: value).rounding(accordingToBehavior: behavior)

let roundedValue2 = NSDecimalNumber(value: 0.6849).rounding(accordingToBehavior: behavior)

所有方法都给我同样的问题。 有什么想法吗?

感谢您的帮助!

编辑: 这个想法是对于所有情况都可以四舍五入,但对于 0.9999 情况则不行。显示的数字总是很小(范围从 0.000 到 1),要显示的小数是参数,因此 0.348 应该是 0.35 而不是 0.34(中继时)

【问题讨论】:

    标签: ios switch-statement rounding precision


    【解决方案1】:
    let amount = 0.99999999999999
    
    let formatter = NumberFormatter()
    
    formatter.numberStyle = .decimal
    
    formatter.maximumFractionDigits = 2
    
    formatter.roundingMode = .floor // rounding mode floor is the key here
    
    let formattedAmount = formatter.string(from: amount as NSNumber)!
    
    print(formattedAmount) // 0.99
    

    【讨论】:

    • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation would greatly improve its long-term value 通过展示为什么这是一个很好的解决问题的方法,并将使其对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。
    • 适用于 0.9999 的情况,但 cos 正在中继 0.3499 之类的情况,只有 0.34,应该是 0.35。谢谢我确实编辑了我的问题以添加额外的信息,如果不够清楚,抱歉。
    • 当你希望 0.999 不变成 1.0 时,你怎么能期望 0.349 变成 0.35?
    • 您说您希望将 0.99999 舍入到小数点后 2 位,并期望结果为 0.99。那不是四舍五入。正确的四舍五入应该是 1.0。您想要 0.99999 的特殊情况吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多