我想將一個小數四舍五入到另一個數字的最接近的增量。例如,給定一個2.23678301的值和一個0.0001的增量,我想將其四舍五入到2.2367。有時,增量可能是像0.00022,在這種情況下,該值將被四舍五入為2.23674。
我試著這樣做,但有時結果并不正確,測驗也沒有通過:
extension Decimal {
func rounded(byIncrement increment: Self) -> Self {
var multipleOfValue = self / increment
var roundedMultipleOfValue = Decimal()
NSDecimalRound(&roundedMultipleOfValue, & multipleOfValue, 0, .down)
return roundedMultipleOfValue *增量
}
}
///測驗
class DecimalTests。XCTestCase {
func testRoundedByIncrement() {
// Given
let值。Decimal = 2.2367830187654
//然后
XCTAssertEqual(value.rounded(byIncrement: 0.00010000), 2.2367)
XCTAssertEqual(value.rounded(byIncrement: 0.00022), 2.23674)
XCTAssertEqual(value.rounded(byIncrement: 0.0000001), 2.236783)
XCTAssertEqual(value.rounded(byIncrement: 0.00000001), 2.23678301) // XCTAssertEqual failed: ("2.23678301")不等于("2.2367830099999744")。
XCTAssertEqual(value.rounded(byIncrement: 3.5), 0)
XCTAssertEqual(value.rounded(byIncrement: 0.000000000000001), 2.2367830187654) // XCTAssertEqual failed: ("2.2367830187653998323726489726140416")不等于("2.236783018765400576")/span>
}
}
我不確定為什么小數點的計算會編造出從未出現過的數字,比如最后的斷言。是否有更干凈或更準確的方法來做到這一點?
uj5u.com熱心網友回復:
你的代碼是好的。你只是錯誤地呼叫了它。這一行并不像你想的那樣:
let value。Decimal =2.2367830187654
這就相當于:
let value = Decimal(double: Double(2.2367830187654)
該值首先被轉換為Double,二進制四舍五入為2.236783018765400576。該值然后被轉換為十進制。
你需要在任何地方使用字串初始化器,以從數字字串中獲得十進制:
你需要使用字串初始化器。
let value = Decimal(string: "2. 2367830187654")!
XCTAssertEqual(value.rounded(byIncrement: Decimal(string: "0.00000001"/span>)! ), Decimal(string: "2.23678301")!)
等等。
或者你可以使用基于整數的初始化器:
let value = Decimal(符號:.plus,指數。-13, significanceand: 22367830187654)
在 iOS 15 中,有一些新的初始化器不會回傳選項(例如,init(_:format:lenient:)),但是你仍然需要傳遞字串,而不是浮點字元。
你也可以這樣做,盡管它可能會讓讀者感到困惑,而且如果人們把引號去掉的話,可能會導致錯誤:
extension Decimal。ExpressibleByStringLiteral {
public init(stringLiteral value: String) {
self.init(string: value)!
}
}
let value。Decimal = "2.2367830187654"
XCTAssertEqual(value.rounded(byIncrement: "0.00000001"/span>), "2.23678301"/span>)
對于測驗代碼來說,這可能是不錯的,但是在生產代碼中使用它,我會非常小心。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/307285.html
標籤:
