NumberFormatter странное поведение - PullRequest
0 голосов
/ 05 октября 2018

Я обнаружил странное поведение в NumberFormatter Swift.

func testNumberFormat() {
    let numberFormat = { (number: NSNumber) -> (String?) in
        let formatter: NumberFormatter = NumberFormatter()
        formatter.numberStyle = .decimal
        formatter.maximumFractionDigits = 2
        formatter.minimumFractionDigits = 2
        formatter.roundingMode = .halfUp

        return formatter.string(from: number)
    }

    XCTAssertEqual(numberFormat(Decimal(0.004) as NSNumber)!, "0.00") // OK
    XCTAssertEqual(numberFormat(Decimal(0.005) as NSNumber)!, "0.01") // OK
    XCTAssertEqual(numberFormat(Decimal(10000.004) as NSNumber)!, "10,000.00") // OK
    XCTAssertEqual(numberFormat(Decimal(10000.005) as NSNumber)!, "10,000.01") // NG!
    XCTAssertEqual(numberFormat(Decimal(10000.014) as NSNumber)!, "10,000.01") // OK
    XCTAssertEqual(numberFormat(Decimal(10000.015) as NSNumber)!, "10,000.02") // OK
}

Следующий тест не пройден.

XCTAssertEqual(numberFormat(Decimal(10000.005) as NSNumber)!, "10,000.01") 

Я ожидаю "10 000, 01", но "10 000, 00"был возвращен.Мое понимание ошибочно?

1 Ответ

0 голосов
/ 05 октября 2018

Попробуйте следующий код:

print(Decimal(10000.005)) //->10000.004999999997952

Знаете, 10000.004999999997952 будет отформатирован как 10,000.00 с вашим numberFormat.

Двоичная с плавающей точкой Double не может представлятьточное значение 10000.005, поэтому трудно предсказать результат Decimal.init(_: Double).

Если вы хотите сохранить точное десятичное представление в Decimal, вместо этого следует использовать Decimal(string:).

print(Decimal(string: "10000.005")!) //->10000.005
print(numberFormat(Decimal(string: "10000.005")! as NSNumber)!) //->10,000.01

Если вы хотите преобразовать Double в Decimal с точным представлением print ed значения, вам может понадобиться еще немного кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...