将float浮动到2位小数的最简单方法?

时间:2015-01-07 20:05:27

标签: swift decimal truncation

在Swift中,有没有办法将浮点数截断为2位小数,这样你就可以用它进行进一步的计算?我见过的所有线程都处理了一个字符串,我无法弄清楚如何使用数学方法。

我尝试使用扩展程序(在此论坛上找到),计算我可以在截断后转回浮动,但我最终在我开始的位置,使用另一个非截断的浮点数。我需要我的返回值是四分之一步(即6.50,6.75,5.25等),而我最终得到的结果就像6.990022 ....

必须有一个简单的方法来做到这一点,但我正在撞墙。提前谢谢......

问题在于:

func roundToNearestQuarter(#power : Float) -> String {

     var errorToLowerQuarterRaw : Float = power % 0.25  // 0.210000038146973

     var errorToLowerQuarterString = errorToLowerQuarterStepRaw.string(2)  // "0.21"

     var errorToLowerQuarter = NSString(string: errorToLowerQuaterStepString).floatValue  // 0.209999993443489

// more code

}

roundToNearestQuater(6.71)

2 个答案:

答案 0 :(得分:11)

无法FloatDouble至2位小数位完全。 原因是这些数据类型使用二进制浮点表示, 并且不能完全代表0.1或0.01之类的数字。 参见例如

但你说:

  

我需要我的返回值为四分之一步(即6.50,6.75,5.25等),

并且完全可以,因为0.25 = 2 -2 可以完全表示为浮点数。

round()函数将浮点数舍入为最接近的整数值。 要四舍五入到最近的一个季度,你只需要" scale"因子4的计算:

func roundToNearestQuarter(num : Float) -> Float {
    return round(num * 4.0)/4.0
}

roundToNearestQuarter(6.71) // 6.75
roundToNearestQuarter(6.6)  // 6.5

答案 1 :(得分:1)

如果您需要使用真正的精度(例如,对于与货币相关的应用程序),您可能希望使用NSDecimalNumber而不是浮点。

上述方法可以应用于NSDecimalNumbers,如下所示。在这个例子中,"步骤"你可以选择任何东西,只需设置"增量"相应

let number: NSDecimalNumber = 100.52
let increment: NSDecimalNumber = 0.25

let handler = NSDecimalNumberHandler(roundingMode: NSRoundingMode.RoundBankers, scale: 0, raiseOnExactness: false, raiseOnOverflow: false, raiseOnUnderflow: false, raiseOnDivideByZero: false)     // Rounds to the nearest whole number
let result = number.decimalNumberByDividingBy(increment).decimalNumberByRoundingAccordingToBehavior(handler).decimalNumberByMultiplyingBy(increment)

有关使用NSDecimalNumber进行舍入的详细信息,请参阅此处:How to round an NSDecimalNumber in swift?

是的,使用NSDecimalNumber是一种非常冗长的数学方法,但它并不复杂。如果您发现自己经常涉及它们的项目,我建议您考虑设置Swift运算符扩展,以便您可以更优雅地操作它们。点击这里查看一个很好的例子:https://gist.github.com/mattt/1ed12090d7c89f36fd28