extension Double {
/// Convert `Double` to `Decimal`, rounding it to `scale` decimal places.
///
/// - Parameters:
/// - scale: How many decimal places to round to. Defaults to `0`.
/// - mode: The preferred rounding mode. Defaults to `.plain`.
/// - Returns: The rounded `Decimal` value.
func roundedDecimal(to scale: Int = 0, mode: NSDecimalNumber.RoundingMode = .plain) -> Decimal {
var decimalValue = Decimal(self)
var result = Decimal()
NSDecimalRound(&result, &decimalValue, scale, mode)
return result
}
}
然后,您可以获得四舍五入的Decimal值,如下所示:
let foo = 427.3000000002
let value = foo.roundedDecimal(to: 2) // results in 427.30
import Foundation
let roundedValue1 = NSString(format: "%.3f", 0.6844)
let roundedValue2 = NSString(format: "%.3f", 0.6849)
print(roundedValue1) // prints 0.684
print(roundedValue2) // prints 0.685
import Foundation
let roundedValue1 = String(format: "%.3f", 0.6844)
let roundedValue2 = String(format: "%.3f", 0.6849)
print(roundedValue1) // prints 0.684
print(roundedValue2) // prints 0.685
30条答案
按热度按时间ds97pgxw16#
您可以使用SWIFT的
round
函数来完成此操作。要以3位精度对
Double
进行舍入,首先将其乘以1000,再对其进行舍入,然后将舍入结果除以1000:与任何类型的
printf(...)
或String(format: ...)
解决方案不同,此操作的结果仍然是类型Double
。编辑:
关于它有时不起作用的评论,请阅读以下内容:What Every Programmer Should Know About Floating-Point Arithmetic
zrfyljdw17#
以下任一项:
使用
String(format:)
:使用
%.3f
格式说明符将Double
类型转换为String
,然后返回到Double
Double
以处理N位小数:通过计算
乘以10^3,四舍五入,然后除以10^3...
Double
以处理N位小数:hts6caw318#
这是一种漫长的变通方法,如果您的需求稍微复杂一些,它可能会派上用场。您可以在SWIFT中使用数字格式化程序。
假设您要打印的变量是
这将确保它以所需的格式返回:
因此,这里的结果将是“3.6”(四舍五入)。虽然这不是最经济的解决方案,但我给出它是因为OP提到了打印(在这种情况下,字符串并不是不需要的),而且因为这个类允许设置多个参数。
5cg8jx4n19#
一种方便的方法是使用双精度类型的扩展
用途:
eaf3rand20#
如果您想要对
Double
值进行舍入,您可能希望使用SWIFT e1d1e,这样就不会在尝试对这些舍入值进行数学运算时出现任何错误。如果使用Decimal
,它可以准确地表示四舍五入浮点值的十进制值。因此您可以执行以下操作:
然后,您可以获得四舍五入的
Decimal
值,如下所示:如果您希望以指定的小数位数显示它(并根据用户的当前区域设置本地化字符串),则可以使用
NumberFormatter
:bwitn5fc21#
使用内置的Foundation Darwin库
SWIFT 3
用途:
产量:12.988
ev7lccsx22#
小数后的特定数字的代码为:
这里的%.3f告诉SWIFT将这个数字四舍五入到小数点后3位。如果你想要双精度数字,你可以使用以下代码:
//将字符串转换为双精度
var roundedString = Double(String(format: "%.3f", b))
kyvafyod23#
SWIFT 4,Xcode 10
v7pvogib24#
在SWIFT 3.0和Xcode 8.0中:
按如下方式使用此扩展:
juud5qan25#
在Yogi回答的基础上,这里有一个SWIFT功能可以完成这项工作:
laik7k3q26#
这是一个完全有效的代码
SWIFT 3.0/4.0/5.0、Xcode 9.0 GM/9.2及更高版本
输出-123
产量-123.3
产量-123.33
产量-123.326
omjgkv6w27#
在SWIFT 5.5和Xcode 13.2中:
示例:
PS:从SWIFT 2.0和Xcode 7.2开始仍然是一样的
6mw9ycah28#
使用SWIFT 5,您可以根据需要选择以下9种样式之一,以便从
Double
获得四舍五入的结果。1.使用
FloatingPoint
rounded()
方法在最简单的情况下,您可以使用
Double``rounded()
方法。2.使用
FloatingPoint
rounded(_:)
方法3.使用Darwin
round
函数基金会通过达尔文提供了
round
函数。4.使用达尔文
round
和pow
函数构建的Double
扩展自定义方法如果您想要多次重复前面的操作,重构您的代码可能是一个好主意。
5.使用
NSDecimalNumber
rounding(accordingToBehavior:)
方法如果需要,
NSDecimalNumber
提供了一个冗长但功能强大的小数舍入解决方案。6.使用
NSDecimalRound(_:_:_:_:)
函数7.使用
NSString
init(format:arguments:)
初始化器如果您希望从舍入操作中返回
NSString
,使用NSString
初始值设定项是一个简单但有效的解决方案。8.使用
String
init(format:_:)
初始化器SWIFT的
String
类型与Foundation的NSString
类连接。因此,您可以使用以下代码从舍入操作返回String
:9.使用
NumberFormatter
如果您希望从舍入运算中获得
String?
,NumberFormatter
提供了高度可定制的解决方案。zengzsys29#
当我打印**
totalWorkTimeInHours
时,如何将其向下舍入为1.543**?要将
totalWorkTimeInHours
舍入为3位数以进行打印,请使用String
构造函数,该构造函数接受format
字符串:idfiyjo830#
SWIFT 2扩展
更通用的解决方案是以下扩展,可与SWIFT 2和iOS 9配合使用:
SWIFT 3扩展
在SWIFT 3中,
round
被替换为rounded
:返回双四舍五入到小数点后4位的示例: