我想将双倍向下舍入到小数点后1位。例如,如果我有一个双let val = 3.1915
,我想将其舍入为3.1
。正常的舍入函数将它舍入到3.2
但我想基本上只删除剩余的小数位。做这个的最好方式是什么?这有本机功能吗?我知道这很简单,但我想知道最好的方法是在哪里,我没有使用任何解决方法或不良做法。这不是其他四舍五入问题的重复,因为我没有询问有关舍入的问题,我问如何删除小数位。
同样,如果值为3.1215
,则它也将舍入为3.1
答案 0 :(得分:2)
使用函数trunc()
(代表截断),这将删除小数部分而不进行舍入。具体来说,将Double
值乘以10,截断它,然后再除以10。然后,要使用1位小数显示,请使用String(format:)
:
let aDouble = 1.15
let truncated = trunc(aDouble * 10) / 10
let string = String(format: "%.1f", truncated
print(string)
(displays "1.1")
或者,处理整个样本值数组:
let floats = stride(from: 1.06, to: 2.0, by: 0.1)
print("Starting array =", Array(floats).map {String(format: "%.3f", $0)})
let trunks = floats
.map {trunc($0 * 10) / 10}
.map {String(format: "%.1f", $0)}
print("Array truncated to 1 decimal place =", trunks)
输出:
Starting array = ["1.060", "1.160", "1.260", "1.360", "1.460", "1.560", "1.660", "1.760", "1.860", "1.960"]
Array truncated to 1 decimal place = ["1.0", "1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7", "1.8", "1.9"]
答案 1 :(得分:1)
根据你的例子,我假设你想要截断,如果是这样的话,使用乘法并转换为Int然后分割并转换回Float / Double就可以了。
示例:3.1915 - > 3.1
var val = 3.1915
let intVal:Int = Int(val*10)
val = Float(intVal)/10.0
print(val) //3.1
如果你想要更多小数位,只需乘以并除以100或1000即可。
然后,如果由于任何原因你想使用round()函数,那么有一个重载变量接受一个FloatingPointRoundingRule它将起作用:
var val = 3.1915
val*=10 //Determine decimal places
val.round(FloatingPoint.towardZero) // .down is also available which differs in rounding negative numbers.
val*=0.1 //This is a divide by 10
print(val) //3.1
在实际使用中,我建议制作扩展或全局功能,而不是每次都写这个块。它看起来像是:
extension Float {
func trunc(_ decimal:Int) {
var temp = self
let multiplier = powf(10,decimal) //pow() for Double
temp = Float(Int(temp*multiplier))/multiplier //This is actually the first example put into one line
return temp
}
}
用过:
var val = 3.1915
print(val.trunc(1)) //3.1
答案 2 :(得分:-1)
使用任何浮点值时的一个问题是它们实际上是如何在引擎盖下表示的。某些十进制浮点数不能由默认的二进制浮点表示精确表示。其原因有点超出了问题的范围,但你可以在这里了解更多信息:
因此,当您想以十进制方式表示浮点二进制时,您有几个选项:
按照最后一个选项,这里使用Decimal
。它是Foundation的一部分,旨在准确表示您尝试的十进制数字:
import Foundation
var value = Decimal(3.1915)
var first = Decimal()
var second = Decimal()
var third = Decimal()
// first, second, third are the results, passed by reference
// value is the initial value, passed by reference
// 1, 2, 3 are the places to the right of the decimal separator
// .down is rounding toward negative infinity
NSDecimalRound(&first , &value, 1, .down)
NSDecimalRound(&second, &value, 2, .down)
NSDecimalRound(&third , &value, 3, .down)
print(value, first, second, third, separator: "\n")
/* 3.1915
3.1
3.19
3.191 */