Skip to content

Commit 937f422

Browse files
authored
Merge pull request swiftlang#2418 from spevans/pr_sr_11150
SR-11150: NSDecimalNumber .multiplying(byPowerOf10:) produces incorrect results.
2 parents 7c9fb6a + 326dfa0 commit 937f422

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

Foundation/NSDecimalNumber.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,12 +303,13 @@ open class NSDecimalNumber : NSNumber {
303303
open func multiplying(byPowerOf10 power: Int16) -> NSDecimalNumber {
304304
return multiplying(byPowerOf10: power, withBehavior: nil)
305305
}
306+
306307
open func multiplying(byPowerOf10 power: Int16, withBehavior b: NSDecimalNumberBehaviors?) -> NSDecimalNumber {
307308
var result = Decimal()
308309
var input = self.decimal
309310
let behavior = b ?? NSDecimalNumber.defaultBehavior
310311
let roundingMode = behavior.roundingMode()
311-
let error = NSDecimalPower(&result, &input, Int(power), roundingMode)
312+
let error = NSDecimalMultiplyByPowerOf10(&result, &input, power, roundingMode)
312313
handle(error,behavior)
313314
return NSDecimalNumber(decimal: result)
314315
}

TestFoundation/TestDecimal.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1143,6 +1143,25 @@ class TestDecimal: XCTestCase {
11431143
XCTAssertEqual(NSDecimalString(&decimal, NSDictionary(dictionary: d4)), "-123456.789")
11441144
}
11451145

1146+
func test_multiplyingByPowerOf10() {
1147+
let decimalNumber = NSDecimalNumber(string: "0.022829306361065572")
1148+
let d1 = decimalNumber.multiplying(byPowerOf10: 18)
1149+
XCTAssertEqual(d1.stringValue, "22829306361065572")
1150+
let d2 = d1.multiplying(byPowerOf10: -18)
1151+
XCTAssertEqual(d2.stringValue, "0.022829306361065572")
1152+
1153+
XCTAssertEqual(NSDecimalNumber(string: "0.01").multiplying(byPowerOf10: 0).stringValue, "0.01")
1154+
XCTAssertEqual(NSDecimalNumber(string: "0.01").multiplying(byPowerOf10: 1).stringValue, "0.1")
1155+
XCTAssertEqual(NSDecimalNumber(string: "0.01").multiplying(byPowerOf10: -1).stringValue, "0.001")
1156+
XCTAssertEqual(NSDecimalNumber(value: 0).multiplying(byPowerOf10: 0).stringValue, "0")
1157+
XCTAssertEqual(NSDecimalNumber(value: 0).multiplying(byPowerOf10: -1).stringValue, "0")
1158+
XCTAssertEqual(NSDecimalNumber(value: 0).multiplying(byPowerOf10: 1).stringValue, "0")
1159+
1160+
XCTAssertEqual(NSDecimalNumber(value: 1).multiplying(byPowerOf10: 128).stringValue, "NaN")
1161+
XCTAssertEqual(NSDecimalNumber(value: 1).multiplying(byPowerOf10: 127).stringValue, "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")
1162+
XCTAssertEqual(NSDecimalNumber(value: 1).multiplying(byPowerOf10: -128).stringValue, "0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001")
1163+
XCTAssertEqual(NSDecimalNumber(value: 1).multiplying(byPowerOf10: -129).stringValue, "NaN")
1164+
}
11461165

11471166
static var allTests : [(String, (TestDecimal) -> () throws -> Void)] {
11481167
return [
@@ -1171,6 +1190,7 @@ class TestDecimal: XCTestCase {
11711190
("test_bridging", test_bridging),
11721191
("test_stringWithLocale", test_stringWithLocale),
11731192
("test_NSDecimalString", test_NSDecimalString),
1193+
("test_multiplyingByPowerOf10", test_multiplyingByPowerOf10),
11741194
]
11751195
}
11761196
}

0 commit comments

Comments
 (0)