2016-07-02 3 views
-1

Пытается вывести общее количество трех значений из словаря, а затем добавить HST 13% к итогу. Однако расчеты распечатываются как $ 13.5261 с четырьмя десятыми местами. Как вырезать конечные десятичные разряды, так что это $ 13,52? Или есть способ вокруг него, так что $ 13,53Как округлить десятичные разряды в swift 2

import UIKit 


var menu = ["Coke": 1.99, "Coffee": 3.99, "Water": 5.99] 

var hst = 1.13 

var total = hst * (menu["Coke"]! + menu["Coffee"]! + menu["Water"]!) 


print("The total for your order is 
$\(total)") 
+2

Не круглые, использование форматирования – Sulthan

+0

Да, использование форматирования, но может потребоваться округление, а также, если вы будете делать какую-либо дальнейшую арифметику с этим числом. – Rob

+0

@Rob Если вы делаете какую-либо арифметику с деньгами, вы должны использовать 'NSDecimalNumber'. – Sulthan

ответ

1

Обычным - и самый универсальный - путь NSNumberFormatter

let menu = ["Coke": 1.99, "Coffee": 3.99, "Water": 5.99] 

let hst = 1.13 

let total = hst * (menu["Coke"]! + menu["Coffee"]! + menu["Water"]!) 

let formatter = NSNumberFormatter() 
formatter.maximumFractionDigits = 2 
let roundedTotal = formatter.stringFromNumber(total)! 

print("The total for your order is $\(roundedTotal)") 
1

не округлять, использование форматирования:

let total: Double = 13.5261 
let currency = "USD" 

let formatter = NumberFormatter() 
formatter.numberStyle = .currency 
formatter.currencyCode = currency 

print("The total for your order is \(formatter.string(from: total as NSNumber)!)") 

Это правильно напечатает сумму денег во всех локалях и правильно разместит символ валюты.

Вам не нужно заботиться о количестве десятичных цифр с .currency, поскольку оно будет использовать количество десятичных цифр, которое должно использоваться с денежными значениями.

+0

не работает с Swift 3! :( – mythicalcoder

+1

@maven Обновлено для swift 3. Он работает одинаково. – Sulthan

0
import Darwin 
let d0 = 1.12345654 
let r0 = round(d0)       // 1 
let r1 = round(10 * d0)/10    // 1.1 
let r2 = round(100 * d0)/100    // 1.12 
//... 
let r7 = round(10000000 * d0)/10000000 // 1.1234565 
3

Для форматирования числа с плавающей точкой, округленное до определенного количества цифр, использовать NSNumberFormatter, как описано другими.

На самом деле вокруг чисел (а не только отображать его с помощью определенного количества знаков после запятой), вы можете использовать NSDecimalNumber:

let menu = ["Coke": 1.99, "Coffee": 3.99, "Water": 5.99] 

let hst = 1.13 

let total = NSDecimalNumber(double: menu["Coke"]!) 
    .decimalNumberByAdding(NSDecimalNumber(double: menu["Coffee"]!)) 
    .decimalNumberByAdding(NSDecimalNumber(double: menu["Water"]!)) 
    .decimalNumberByMultiplyingBy(NSDecimalNumber(double: hst), withBehavior: RoundingBehavior()) 

let message = "The total for your order is \(total)" 

Как правило, только с помощью NSNumberFormatter адекватен, но если вы собираетесь чтобы сделать любую дальнейшую арифметику с этими округленными числами (например, добавить кучу округлых чисел), вам фактически нужно округлить их, как показано выше, вместо того, чтобы полагаться на форматировщик.

Обратите внимание, выше RoundingBehavior определяется округлить до двух знаков после запятой:

class RoundingBehavior: NSObject, NSDecimalNumberBehaviors { 
    func roundingMode() -> NSRoundingMode { 
     return .RoundPlain 
    } 

    func scale() -> Int16 { 
     return 2 
    } 

    func exceptionDuringOperation(operation: Selector, error: NSCalculationError, leftOperand: NSDecimalNumber, rightOperand: NSDecimalNumber?) -> NSDecimalNumber? { 
     return nil 
    } 
}