Может кто-нибудь сказать мне, как округлить двойное значение до х числа десятичных знаков в Swift?
Я имею:
var totalWorkTimeInHours = (totalWorkTime/60/60)
С totalWorkTime
NSTimeInterval (двойной) в секунду.
totalWorkTimeInHours
даст мне часы, но это даст мне количество времени в таком длинном точном числе, например 1.543240952039 ......
Как мне округлить до, скажем, 1.543 при печати totalWorkTimeInHours
?
ios
swift
double
nstimeinterval
Лейтон
источник
источник
round(_:)
,Double
round()
,NSString
инициализатором,String
инициализатором,NumberFormatter
, двойное расширением или дажеNSDecimalNumber
иDecimal
.Ответы:
Вы можете использовать
round
функцию Swift для достижения этой цели.Для округления
Double
с точностью до 3 цифр сначала умножьте его на 1000, округлите и разделите округленный результат на 1000:Помимо любого вида
printf(...)
илиString(format: ...)
решения, результат этой операции все еще имеет типDouble
.РЕДАКТИРОВАТЬ:
Что касается комментариев, которые иногда не работают, пожалуйста, прочитайте это:
Что каждый программист должен знать об арифметике с плавающей точкой
источник
let rate = 9.94999999999; Double(round(rate * 100) / 100);
Вывод:9.94999999999, 9.949999999999999
работает только для печати, но как я могу назначить его переменной?Удлинитель для Swift 2
Более общим решением является следующее расширение, которое работает с Swift 2 и iOS 9:
Удлинитель для Swift 3
В Swift 3
round
заменяетсяrounded
:Пример, который возвращает Double, округленный до 4 десятичных знаков:
источник
round(8.46 * pow(10.0, 3.0)) / pow(10.0, 3.0)
возврат8.460000000000001
. Делать то же самое с Float, по крайней мере, в этом сценарии , на самом деле, похоже, работает:round(Float(8.46) * pow(10.0, 3.0)) / pow(10.0, 3.0)
доходность8.46
. Просто кое-что стоит отметить.No '*' candidates produce the expected contextual result type 'FloatingPointRoundingRule'
Чтобы округлить
totalWorkTimeInHours
до 3 цифр для печати, используйтеString
конструктор, который принимаетformat
строку:источник
String(format: "%.3f", 1.23489)
печатает1.235
В Swift 5, в соответствии с вашими потребностями, вы можете выбрать один из 9 следующих стилей , чтобы получить округленный результат от a
Double
.# 1. Используя
FloatingPoint
rounded()
методВ простейшем случае вы можете использовать
Double
rounded()
метод.# 2. Используя
FloatingPoint
rounded(_:)
метод# 3. Использование
round
функции ДарвинаФонд предлагает
round
функцию через Дарвина.# 4. Использование
Double
собственного метода расширения, созданного с помощью Darwinround
иpow
функцийЕсли вы хотите повторить предыдущую операцию много раз, рефакторинг вашего кода может быть хорошей идеей.
# 5. Используя
NSDecimalNumber
rounding(accordingToBehavior:)
методПри необходимости
NSDecimalNumber
предлагает подробное, но мощное решение для округления десятичных чисел.# 6. Используя
NSDecimalRound(_:_:_:_:)
функцию# 7. Использование
NSString
init(format:arguments:)
инициализатораЕсли вы хотите получить возврат
NSString
из операции округления, использованиеNSString
инициализатора является простым, но эффективным решением.# 8. Использование
String
init(format:_:)
инициализатораString
Тип Swift соединен сNSString
классом Foundation . Следовательно, вы можете использовать следующий код для возвратаString
из операции округления:# 9. С помощью
NumberFormatter
Если вы ожидаете получить
String?
от вашей операции округления,NumberFormatter
предлагает очень настраиваемое решение.источник
Decimal
, который бесплатный для мостаNSDecimalNumber
.Decimal
является родным тип и предлагает Свифта более изящная поддержка родных операторов , как+
,-
и т.д.NSDecimalRound(_:_:_:_:)
функции. Спасибо.NumberFormatter
, что последний вариант, хотя он должен быть первым для представления чисел пользователям. Ни один другой метод не генерирует правильно локализованные числа.В Swift 2.0 и Xcode 7.2:
Пример:
источник
Это полностью проработанный код
Swift 3.0 / 4.0 / 5.0, Xcode 9.0 GM / 9.2 и выше
выход - 123
выход - 123,3
выход - 123,33
выход - 123,326
источник
Основываясь на ответе Йога, вот функция Swift, которая делает эту работу:
источник
В Swift 3.0 и Xcode 8.0:
Используйте это расширение так:
источник
Swift 4, Xcode 10
источник
Код для конкретных цифр после десятичных знаков:
Здесь% .3f сообщает swift, чтобы это число было округлено до 3 десятичных знаков. И если вы хотите получить двойное число, вы можете использовать этот код:
var roundedString = Double(String(format: "%.3f", b))
источник
Используйте встроенную библиотеку Foundation Darwin
SWIFT 3
Применение:
Выходы: 12,988
источник
Удобным способом может быть использование расширения типа Double
Применение:
источник
Если вы хотите округлить
Double
значения, вы можете использовать Swift,Decimal
чтобы не допустить ошибок, которые могут возникнуть при попытке вычислить эти округленные значения. Если вы используетеDecimal
, он может точно представлять десятичные значения этого округленного значения с плавающей запятой.Так что вы можете сделать:
Затем вы можете получить округленное
Decimal
значение следующим образом:И если вы хотите отобразить его с указанным количеством десятичных знаков (а также локализовать строку для текущей локали пользователя), вы можете использовать
NumberFormatter
:источник
(4.81).roundedDecimal(to: 2, mode: .down)
вернет 4.8 вместо 4.81, используйтеDecimal(string: self.description)!
для точногоdecimalValue
Double
(становится4.8099999999999996
). Но я бы посоветовал не использоватьdescription
(поскольку округление, которое он использует, не задокументировано и может быть изменено). Если вы действительно хотите делать математику с точностью до десятичного знака, вам следует избегатьDouble
целиком и вместо этого использоватьDecimal
напрямую (например,Decimal(sign: .plus, exponent: -2, significand: 481)
илиDecimal(string: "4.81")
. Но не используйтеdescription
.description
метода округления не задокументировано и не гарантировано. Плюс, это не локализовано. ИМХО, это ошибка использоватьdescription
для чего-либо кроме целей регистрации. Я бы использовалDecimal
всюду, избегая использованияDouble
целиком, или просто использовал другой режим округления. Или, если необходимо, используйте свой собственный локализованный метод, который использует алгоритм в стиле Грису (но это кажется ненужным, когда вы знаете, сколько десятичных разрядов вы хотите округлить). Но я бы не стал полагаться на это вспомогательное поведениеdescription
.Это своего рода долгий обходной путь, который может пригодиться, если ваши потребности немного сложнее. Вы можете использовать средство форматирования чисел в Swift.
Предположим, что ваша переменная, которую вы хотите напечатать
Это гарантирует, что он будет возвращен в желаемом формате:
Таким образом, результатом здесь будет «3,6» (округлено). Хотя это не самое экономичное решение, я даю его, потому что OP упоминает печать (в этом случае строка не является нежелательной), и потому что этот класс позволяет устанавливать несколько параметров.
источник
я хотел бы использовать
и измените .3f на любое количество десятичных чисел, которое вам нужно
источник
Или:
Использование
String(format:)
:Приведение
Double
кString
с%.3f
спецификатор формата , а затем обратноDouble
Или расширить
Double
для обработки N-десятичных разрядов:По расчету
умножьте на 10 ^ 3, округлите его и затем разделите на 10 ^ 3 ...
Или расширить
Double
для обработки N-десятичных разрядов:источник
Это более гибкий алгоритм округления до N значащих цифр
Swift 3 решение
источник
Лучший способ отформатировать двойное свойство - это использовать предопределенные методы Apple.
FloatingPointRoundingRule - это перечисление, которое имеет следующие возможности
Случаи перечисления:
case awayFromZero Округлить до ближайшего допустимого значения, величина которого больше или равна величине источника.
case down Округление до ближайшего допустимого значения, которое меньше или равно источнику.
case toNearestOrAwayFromZero Округлить до ближайшего допустимого значения; если два значения одинаково близки, выбирается значение с большей величиной.
case toNearestOrEven Округлить до ближайшего допустимого значения; если два значения одинаково близки, выбирается четное.
случай в направлении нуля. Округление до ближайшего допустимого значения, величина которого меньше или равна величине источника.
case up Округлить до ближайшего допустимого значения, которое больше или равно источнику.
источник
округлите двойное значение до x числа десятичного числа
NO. цифр после десятичной
источник
Не Свифт, но я уверен, что вы поняли идею.
источник
Это похоже на работу в Swift 5.
Весьма удивлен, что для этого уже нет стандартной функции.
// Усечение двойных до n-десятичных разрядов с округлением
источник
Вы можете добавить это расширение:
и назовите это так:
источник
Чтобы избежать недостатков Float, используйте Decimal
ех.
1075,58 раундов до 1075,57 при использовании Float со шкалой: 2 и .down
1075,58 раундов до 1075,58 при использовании десятичного со шкалой: 2 и .down
источник
Я обнаружил, что это интересно, если можно исправить ввод пользователя. Это если они вводят три знака после запятой вместо двух для суммы в долларах. Скажем, 1.111 вместо 1.11, вы можете исправить это путем округления? Ответ по многим причинам - нет! Если деньги превышают 0,001, это может вызвать проблемы в реальной чековой книжке.
Вот функция для проверки ввода пользователем слишком большого количества значений после периода. Но что позволит 1., 1.1 и 1.11.
Предполагается, что значение уже проверено на успешное преобразование из String в Double.
источник
источник
Применение :
источник
Вот один из них для SwiftUI, если вам нужен элемент Text с числовым значением.
источник