fs_tigre
fs_tigre

Reputation: 10748

Why subtracting NSDecimalNumbers do not work - Swift 3

Why am I getting 0 when subtracting 5.0 from 650.50 using the subtracting() method?

in the following code, adding, multiplying and dividing work fine, but why subtracting doesn't? What am I doing wrong?

See code in IBM's 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

Apples Docs: https://developer.apple.com/documentation/foundation/nsdecimalnumber

Upvotes: 3

Views: 669

Answers (2)

Papershine
Papershine

Reputation: 5233

Your code isn't wrong and works correctly in Xcode/macOS. However, IBM's Swift sandbox uses Linux, and the implementation of Foundation on Linux has issues. In the Status page of the repo, NSDecimalNumber is marked as "Unimplemented". Therefore, it may have some problems. Use classes from the standard library instead.

Upvotes: 2

Eric Aya
Eric Aya

Reputation: 70119

This may be because of a specificity of the IBM sandbox related to NSDecimalNumber (indeed many parts of Foundation are still not entirely available on Linux).

Anyway, whatever the bug is, a solution is to use the Swift counterpart to NSDecimalNumber which is Decimal.

Despite the fact that this is supposed to be only a wrapper around NSDecimalNumber, it gives the correct result, even on the IBM platform.

Note that this wrapper doesn't use the NSDecimalNumber methods, it uses Swift operators such as + or *.

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)")

Gives:

Addition: 655.5
Subtraction: 645.5
Multiplication: 3252.5
Division: 130.1

Upvotes: 2

Related Questions