Легкий способ усечь 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