2017-09-07 3 views
3

Warum bekomme ich 0, wenn 5.0 von 650.50 mit der subtracting() Methode subtrahiert wird?Warum subtrahieren NSDecimalNumbers nicht funktionieren - Swift 3

im folgenden Code, Hinzufügen, Multiplizieren und Dividieren funktionieren gut, aber warum Subtraktion nicht? Was mache ich falsch?

Siehe Code in IBMs Sandbox: http://swift.sandbox.bluemix.net/#/repl/59b1387696a0602d6cb19201

import Foundation 

let num1:NSDecimalNumber = 650.50 
let num2:NSDecimalNumber = 5.0 

let result = num1.adding(num2) 
let result2 = num1.subtracting(num2) 
let result3 = num1.multiplying(by: num2) 
let result4 = num1.dividing(by: num2) 

print("Addition: \(result)") // Addition: 655.5 
// Why am I getting 0 here and not 645.5? 
print("Subtraction: \(result2)") //Subtraction: 0 
print("Multiplication: \(result3)") //Multiplication: 3252.5 
print("Division: \(result4)") //Division: 130.1 

Äpfel Docs: https://developer.apple.com/documentation/foundation/nsdecimalnumber

+2

Ich bekam "645.5" in XCode Swift Playground. Könnte ein Problem auf dem IBM Teil sein (naja sagen wir nicht iOS/MacOS Swift Teil). – Larme

+0

Hmm, das ist komisch. Danke für die Überprüfung (Ich bin gerade von meinem Computer entfernt). –

+3

Versuchen Sie mit 'result2.doubleValue' – Raymond

Antwort

2

Dies wegen einer Spezifität der IBM Sandbox NSDecimalNumber verwandt sein kann (in der Tat viele Teile der Stiftung sind nach wie vor nicht vollständig verfügbar unter Linux).

Wie auch immer, was der Fehler ist, eine Lösung des Swift Pendant zu NSDecimalNumber zu verwenden ist, die Decimal.

Trotz der Tatsache ist, dass dies nur ein Wrapper um NSDecimalNumber sein soll, gibt es das richtige Ergebnis, auch auf der IBM Plattform.

Beachten Sie, dass dieser Wrapper die NSDecimalNumber-Methoden nicht verwendet, verwendet Swift-Operatoren wie + oder *.

import Foundation 

let num1: Decimal = 650.50 
let num2: Decimal = 5.0 

let result = num1 + num2 
let result2 = num1 - num2 
let result3 = num1 * num2 
let result4 = num1/num2 

print("Addition: \(result)") 
print("Subtraction: \(result2)") 
print("Multiplication: \(result3)") 
print("Division: \(result4)") 

Gibt:

Zusatz: 655,5
Subtraktion: 645,5
Multiplikation: 3.252,5
Liga: 130,1

+0

Schnelle Frage, wird "Dezimal" als "NSDecimalNumber" betrachtet? Mit anderen Worten, ist "Dezimal" empfohlene Währung? Danke vielmals! –

+1

'Decimal' soll vom selben Typ wie' NSDecimalNumber' sein, wurde aber in Swift konvertiert. Es ist wirklich für Geldberechnungen gedacht (dekadische, hochpräzise Arithmetik). Es fehlen jedoch einige Methoden im Vergleich zu 'NSDecimalNumber'. – Sulthan

+1

@fs_tigre Die Dokumentation besagt, dass die beiden überbrückt sind, also würde ich sagen, dass ja, Decimal das gleiche Verhalten haben soll. – Moritz

2

Ihr Code ist nicht falsch und funktioniert einwandfrei in Xcode /Mac OS. Die Swift-Sandbox von IBM verwendet jedoch Linux, und die Implementierung von Foundation unter Linux hat issues. In der Status Seite des Repos ist NSDecimalNumber als "nicht implementiert" markiert. Daher kann es einige Probleme haben. Verwenden Sie stattdessen Klassen aus der Standardbibliothek.

Verwandte Themen