我打印出一个我不知道的价值的数字。在大多数情况下,数字是完整的或具有尾随.5。在某些情况下,数字以.25或.75结尾,很少这个数字到千分之一的地方。我如何具体检测最后一个案例?现在我的代码检测到整数(0位小数),正好是.5(1位小数),然后在所有其他方案中恢复为2个小数点,但是当它需要时我需要转到3。
class func getFormattedNumber(number: Float) -> NSString {
var formattedNumber = NSString()
// Use the absolute value so it works even if number is negative
if (abs(number % 2) == 0) || (abs(number % 2) == 1) { // Whole number, even or odd
formattedNumber = NSString(format: "%.0f", number)
}
else if (abs(number % 2) == 0.5) || (abs(number % 2) == 1.5) {
formattedNumber = NSString(format: "%.1f", number)
}
else {
formattedNumber = NSString(format: "%.2f", number)
}
return formattedNumber
}
答案 0 :(得分:12)
Float
使用二进制(IEEE 754)表示,无法表示
精确的所有小数部分。例如,
let x : Float = 123.456
以x
存储字节42f6e979
,大约是。{
123.45600128173828
。那么x
有3个或14个小数位吗?
如果指定最大数量,则可以使用NSNumberFormatter
应该出现的十进制数字:
let fmt = NSNumberFormatter()
fmt.locale = NSLocale(localeIdentifier: "en_US_POSIX")
fmt.maximumFractionDigits = 3
fmt.minimumFractionDigits = 0
println(fmt.stringFromNumber(123)!) // 123
println(fmt.stringFromNumber(123.4)!) // 123.4
println(fmt.stringFromNumber(123.45)!) // 123.45
println(fmt.stringFromNumber(123.456)!) // 123.456
println(fmt.stringFromNumber(123.4567)!) // 123.457
Swift 3/4更新:
let fmt = NumberFormatter()
fmt.locale = Locale(identifier: "en_US_POSIX")
fmt.maximumFractionDigits = 3
fmt.minimumFractionDigits = 0
print(fmt.string(for: 123.456)!) // 123.456
答案 1 :(得分:3)
您可以使用%g
来抑制尾随零。然后我认为你不需要经历确定地点数量的业务。例如 -
var num1:Double = 5.5
var x = String(format: "%g", num1) // "5.5"
var num2:Double = 5.75
var x = String(format: "%g", num2) // "5.75"
或指定场所数量的变化。例如 -
var num3:Double = 5.123456789
var x = String(format: "%.5g", num3) // "5.1235"
答案 2 :(得分:2)
我的2美分;)Swift 3准备好了
将浮动数字舍入,并将尾随零点删除到所需的最小/最大小数位数。
extension Double {
func toString(minimumFractionDigits: Int = 0, maximumFractionDigits: Int = 2) -> String {
let formatter = NumberFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.minimumFractionDigits = minimumFractionDigits
formatter.maximumFractionDigits = maximumFractionDigits
return formatter.string(from: self as NSNumber)!
}
}
用法:
Double(394.239).toString() // Output: 394.24
Double(394.239).toString(maximumFractionDigits: 1) // Output: 394.2
答案 3 :(得分:0)
如果要将浮点数打印到3位小数,可以使用String(format: "%.3f")
。这将是圆的,因此0.10000001
变为0.100
,0.1009
变为0.101
等。
但听起来你不想要尾随的零,所以你可能想要修剪掉它们。 (有没有办法用format
执行此操作?编辑:是,g
正如@simons指出的那样)
最后,这实际上不应该是类函数,因为它在原始类型上运行。最好是使其成为自由函数,或者扩展Double
/ Float
:
extension Double {
func toString(#decimalPlaces: Int)->String {
return String(format: "%.\(decimalPlaces)g", self)
}
}
let number = -0.3009
number.toString(decimalPlaces: 3) // -0.301