我正在打印一个我不知道其值的数字。在大多数情况下,该数字为整数或结尾为0.5。在某些情况下,该数字以.25或.75结尾,而极少数情况下该数字达到千分之一。我该如何具体检测到最后一种情况?现在,我的代码检测到一个整数(0个小数位),精确地为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 }
A Float使用二进制(IEEE 754)表示形式,不能精确表示所有十进制小数。例如,
Float
let x : Float = 123.456
存储在x字节中42f6e979,大约为 123.45600128173828。那x有3或14个小数位数吗?
x
42f6e979
123.45600128173828
您可以使用NSNumberFormatter,如果您指定的 最大数量 的应提交十进制数字:
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