extension Double {
/// Reduces a double's scale (truncates digits right of the decimal).
func reduceScale(to places: Int) -> Double {
guard !self.isNaN,
!self.isInfinite else {
return 0 // if the double is not a number or infinite, this func will throw an exception error
}
let multiplier = pow(10, Double(places))
let newDecimal = multiplier * self // move the decimal right
let truncated = Double(Int(newDecimal)) // drop the fraction
let originalDecimal = truncated / multiplier // move the decimal back
return originalDecimal
}
}
let dirty = 3.1415927
let clean = dirty.reduceScale(to: 2) // 3.14
6条答案
按热度按时间new9mtju1#
您可以使用
NumberFormatter
:ttygqcqt2#
四舍五入,得到双倍的回报。
这不会截断,但可能足够准确的长/纬度到5个小数位,是快速的。
t2a7ltrp3#
这是一个数学问题,而不是编码问题。在
String
和Double
之间转换不是很有吸引力。在数学中,截断小数点右侧的数字称为缩减比例。要截断非整数,您所需要做的就是将小数向右移动,无论您希望它截断多少位(乘以10
将其移1,乘以100
将其移2,依此类推),将其转换为整数(这将删除新小数点后的所有内容),然后将其除以原始乘数以将小数点返回到其原始位置。要将pi的比例缩小到
3
:1.向右移动小数:三点一四一万五千九百二十七 * 十立方=三千一百四十一点五九二七
1.零分数= 3141.0
1.向后移动小数:3141 / 10^3 = 3.141
为方便起见,将其添加为
Double
的扩展:disbfnqx4#
我建议使用
NSDecimalNumber
。我不知道这实际上比@列奥纳多的答案更好还是更差。但是当处理数字时,我更喜欢坚持数字,而不是字符串转换。下面的代码生成了一个函数,用于请求的数字位数,可以根据需要重用。此函数通过向下舍入进行截断。要获得正常的算术舍入,请将其更改为使用
.RoundPlain
而不是.RoundDown
。bq8i3lrv5#
我在另一个网站上找到了不同的答案,想分享一下:
y returns 129.888
多亏了swift的“round”功能。
6qqygrtg6#
令x =(长 *100000).四舍五入(.到零)/100000