在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)
答案 0 :(得分:11)
您无法将Float
或Double
至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