我在斯威夫特的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“。我的理解错了吗?
发布于 2018-10-05 11:22:41
尝试以下代码:
print(Decimal(10000.005)) //->10000.004999999997952您知道,numberFormat会将10000.004999999997952格式化为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,并精确地表示printed值,则可能需要更多代码。
https://stackoverflow.com/questions/52657774
复制相似问题