소수를 반올림하는 것이 좋지만 정밀도를 줄여야하는 시나리오에 직면 해 있습니다.
출력 : 15.96 ~ 16.0
코드 :
var value: AnyObject = dict.valueForKey("XXX")!
var stringVal = NSString(format:"%.1f", value.floatValue)
나는 이것이 간단 할 것이라고 생각했지만 까다로웠다. 이에 대한 귀하의 의견은 매우 감사합니다.
향후 수학 연산에서 반올림 된 숫자를 사용해야하는 경우 다음 함수를 사용할 수 있습니다.
func roundToPlaces(_ value: Double, places: Int, rule: FloatingPointRoundingRule = .toNearestOrAwayFromZero) -> Double {
let divisor = pow(10.0, Double(places))
return (value * divisor).rounded(rule) / divisor
}
그런 다음
var value: AnyObject = dict.valueForKey("XXX")!
var rounded = roundToPlaces(value.doubleValue, places: 1, rule: .down)
var stringVal = "\(rounded)"
이것이 실제로 한 일은 다음과 같습니다.
15.96 * 10.0 = 159.6
floor(159.6) = 159.0
159.0 / 10.0 = 15.9
주의 사항 : 과학적 정밀도를 사용하는 상황에서는 도움 이되지 않습니다.
1.49850e0 --> 1.4e0 // (5 places --> 1 place)
1.39e10 --> 1.3e10 // (3 places --> 1 place)
모든 숫자를 다음과 같이 처리합니다. e0
[업데이트 2018-08-09]
내 대답이 일부 뷰를 얻는 것 같아서 부동 소수점 숫자가 메모리에 저장되는 방식으로 인해 나눗셈으로 부동 소수점 숫자를 반올림하면 오류가 발생할 수 있다는 점을 지적하고 싶습니다. @mattt 사용자가 다른 곳에서 지적했듯이 :
floor(1.5679999 * 1000) / 1000 == 1.5669999999999999
(수학을 배우고 싶다면 이 논문 은 숫자와 컴퓨터에 대한 훌륭한 입문서입니다.)
그 정도의 정밀도가 필요한 경우에는 대신 고정 소수점 숫자를 사용하십시오. Swift는 Decimal
이러한 목적으로 유형을 제공합니다 .
중요한 것은 문제를 이해하는 것입니다. 돈이나 센서 데이터로 작업하는 경우 Decimals가 필요할 것입니다. 컴퓨터 그래픽으로 작업하는 경우 Floats를 사용할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다