首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NumberFormatter奇怪的行为

NumberFormatter奇怪的行为
EN

Stack Overflow用户
提问于 2018-10-05 10:57:48
回答 1查看 77关注 0票数 0

我在斯威夫特的NumberFormatter中发现了一个奇怪的行为。

代码语言:javascript
复制
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
}

以下测试失败。

代码语言:javascript
复制
XCTAssertEqual(numberFormat(Decimal(10000.005) as NSNumber)!, "10,000.01") 

我希望是"10,000,01",但返回的是"10,000,00“。我的理解错了吗?

EN

回答 1

Stack Overflow用户

发布于 2018-10-05 11:22:41

尝试以下代码:

代码语言:javascript
复制
print(Decimal(10000.005)) //->10000.004999999997952

您知道,numberFormat会将10000.004999999997952格式化为10,000.00

二进制浮点Double不能表示10000.005的精确值,因此Decimal.init(_: Double)的结果很难预测。

如果您希望在Decimal中使用精确的小数表示法,则应该改用Decimal(string:)

代码语言:javascript
复制
print(Decimal(string: "10000.005")!) //->10000.005
print(numberFormat(Decimal(string: "10000.005")! as NSNumber)!) //->10,000.01

如果您想要将Double转换为Decimal,并精确地表示printed值,则可能需要更多代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52657774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档