gpt4 book ai didi

swift - NumberFormatter 奇怪的行为

转载 作者:行者123 更新时间:2023-11-30 11:06:28 28 4
gpt4 key购买 nike

我在 Swift 的 NumberFormatter 中发现了一个奇怪的行为。

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”。难道是我的理解有误?

最佳答案

尝试以下代码:

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

您知道 10000.004999999997952 将使用您的 numberFormat 格式化为 10,000.00

二进制浮点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 并精确表示打印值,您可能需要更多代码。

关于swift - NumberFormatter 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52657774/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com