2016-12-20 6 views
3

Я не знаю, как округлить число следующим образом в Swift:Бухгалтер округление в быстром

6.51,6.52,6.53, 6,54 должны быть округлены до 6,50

6.56, 6.57, 6.58, 6,59 должны быть округлены до 6,55

Я уже пробовал

func roundDown(number: Double, toNearest: Double) -> Double { 
    return floor(number/toNearest) * toNearest 
} 

ни к какому успеху. Есть предположения ?

+1

Не 'roundDown (число: 6.56, toNearest: 0.05)' дайте то, что вы хотите? –

+0

Да, вот и все! Я полностью пропустил это. Спасибо – fbelfort

+0

Вот пример, где он терпит неудачу: 'roundDown (число: 100.1, toNearest: 0.05)' дает '100.05' вместо ожидаемого' 100.1'. –

ответ

1

Вот ваша проблема (и это не имеет никакого отношения к Swift вообще): арифметика с плавающей точкой не является точной. Предположим, вы пытаетесь разделить 6.55 на 0.05 и ожидать результата 131.0. В действительности, 6.55 - это «некоторое число, близкое к 6.55», а 0,05 - «некоторое число, близкое к 0,05», поэтому результат, который вы получаете, «некоторое число, близкое к 131.0». Этот результат, вероятно, всего лишь чуть меньше 131.0, может быть, 130.999999999999, а floor() возвращает 130.0.

Что вы делаете: вы сами решаете, какое минимальное число вы хотите округлить. Например, вы хотите, чтобы 130.999999999999 дали результат 131.0. Вероятно, вам понадобится 130.9999, чтобы получить результат 131.0. Таким образом изменить свой код

floor (number * 20.0 + 0.0001); 

Это круглый 6,549998 до 6,55, так что проверить, если вы хорошо с этим. Кроме того, floor() работает неожиданным образом для отрицательного ввода, поэтому -6.57 будет округлено до -6.60, что, скорее всего, не то, что вы хотите.

+0

Я не хочу округлять 6.54 до 6.55, но до 6.50. roundDown (число: 6.56, toNearest: 0.05) – fbelfort

+0

Невозможно гарантировать, что 6.55 будет округлено до 6.55, если вы не согласитесь, что некоторые меньшие числа округлены до 6.55. Измените это с «no way» на «no f *** ing way». И этот раунд от 6,54 до 6,5. – gnasher729