将浮点数截断到小数点后两位的最简单方法?
Easiest way to truncate float to 2 decimal places?
在 Swift 中,有没有办法将浮点数截断为 2 位小数,以便您可以用它执行进一步的计算?我见过的所有线程都处理转换为字符串,我无法弄清楚如何在数学上使用它。
我尝试使用一个扩展(在这个论坛上找到),我想我可以在截断后转换回 float,但我最终回到了我开始的地方,使用另一个未截断的 float。我需要我的 return 值以四分之一为单位(即 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)
您 不能 将 Float
或 Double
舍入到 2 个小数位 完全 。
原因是这些数据类型使用二进制浮点表示,
并且不能准确表示 0.1 或 0.01 之类的数字。
参见示例
- Why Are Floating Point Numbers Inaccurate?
- What Every Computer Scientist Should Know About Floating-Point Arithmetic
但是你说:
I need my return value to be in quarter steps (i.e. 6.50, 6.75, 5.25, etc),
并且 正好 是可能的,因为 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
如果您需要以真正的精度工作(例如,对于与货币相关的应用程序),您可能希望使用 NSDecimalNumber 而不是浮点数。
上述方法可以应用于 NSDecimalNumbers,如下所示。在此示例中,您要四舍五入的 "step" 可以是您选择的任何内容,只需相应地设置 "increment"。
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 舍入的更多信息,请参见此处:
是的,使用 NSDecimalNumber 是一种非常冗长的数学计算方式,但并不复杂。如果您发现自己在做一个经常涉及它们的项目,我建议您考虑设置 Swift 运算符扩展,以便您可以以更优雅的方式操作它们。在这里查看一个很好的例子:https://gist.github.com/mattt/1ed12090d7c89f36fd28
在 Swift 中,有没有办法将浮点数截断为 2 位小数,以便您可以用它执行进一步的计算?我见过的所有线程都处理转换为字符串,我无法弄清楚如何在数学上使用它。
我尝试使用一个扩展(在这个论坛上找到),我想我可以在截断后转换回 float,但我最终回到了我开始的地方,使用另一个未截断的 float。我需要我的 return 值以四分之一为单位(即 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)
您 不能 将 Float
或 Double
舍入到 2 个小数位 完全 。
原因是这些数据类型使用二进制浮点表示,
并且不能准确表示 0.1 或 0.01 之类的数字。
参见示例
- Why Are Floating Point Numbers Inaccurate?
- What Every Computer Scientist Should Know About Floating-Point Arithmetic
但是你说:
I need my return value to be in quarter steps (i.e. 6.50, 6.75, 5.25, etc),
并且 正好 是可能的,因为 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
如果您需要以真正的精度工作(例如,对于与货币相关的应用程序),您可能希望使用 NSDecimalNumber 而不是浮点数。
上述方法可以应用于 NSDecimalNumbers,如下所示。在此示例中,您要四舍五入的 "step" 可以是您选择的任何内容,只需相应地设置 "increment"。
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 舍入的更多信息,请参见此处:
是的,使用 NSDecimalNumber 是一种非常冗长的数学计算方式,但并不复杂。如果您发现自己在做一个经常涉及它们的项目,我建议您考虑设置 Swift 运算符扩展,以便您可以以更优雅的方式操作它们。在这里查看一个很好的例子:https://gist.github.com/mattt/1ed12090d7c89f36fd28