Легкий способ усечь float до 2 знаков после запятой?
в 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 ответов
вы не может вокруг Float
или Double
до 2 десятичных знаков ровно.
Причина в том, что эти типы данных используют двоичное представление с плавающей запятой,
и не может точно представлять числа, такие как 0.1 или 0.01.
См., например,
- Почему Числа С Плавающей Точкой Неточны?
- Что Каждый Компьютерщик Должен Знать Об Арифметике С Плавающей Запятой
но вы сказал:
мне нужно, чтобы мое возвращаемое значение было в четверть шага (т. е. 6.50, 6.75, 5.25 и т. д.),
и ровно возможно, потому что 0.25 = 2-2 можно представить в виде числа с плавающей точкой.
на округляет число с плавающей запятой до ближайшего целого значения. Чтобы округлить до ближайшего квартала, вам просто нужно "масштабировать" расчет с коэффициентом 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, как показано ниже. В этом примере "шаг", который вы округляете, может быть чем угодно, просто установите" приращение " соответственно.
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 в Свифт?
и да, работа с NSDecimalNumber-ужасно подробный способ сделать математику, но это не сложно. Если вы часто занимаетесь проектом с их участием, я рекомендую вам подумать о настройке расширений операторов Swift, чтобы вы могли управлять ими более элегантно. Проверьте здесь для хорошего примера:https://gist.github.com/mattt/1ed12090d7c89f36fd28