如何在Swift中获取浮点数的小数精度?所有现有的答案都使用某种形式的字符串转换,这是低效的。我特意寻找一种不涉及字符串转换的方法。
这个问题是基于一种误解。感谢@MartinR和@SimonByrne,我已经意识到并纠正了我的理解错误。
答案 0 :(得分:2)
正如其他评论者所指出的那样,浮点数的“十进制精度”实际上并不存在:当你写x = 0.123
之类的内容时,你真正设置x
为是最近的双精度浮点数到0.123,实际上是:
0.1229999999999999982236431605997495353221893310546875
根据您提出的答案,您的问题将更准确地说明为将十进制近似值中的最小小数位数计算为浮点数。
为此,您的代码对于“合理”值应该是正确的,但是如果您有超过22个小数位,您可能会看到一些错误,因为tens
变量将不再是精确的(10 23 不能用双精度浮点数精确表示。有关这方面的更多详细信息,请阅读二进制到十进制的转换:我建议您查看Rick Regan的网页:
http://www.exploringbinary.com/tag/convert-to-decimal/
答案 1 :(得分:0)
这是怎么做的:
func getPrecision(valueFunction: (@autoclosure () -> Double)) -> Int
{
let value = valueFunction()
var tens: Double = 1.0
var precision: Int = 0
while (floor((value * tens) + 0.1) / tens) != value
{
tens *= 10
precision++
}
return precision
}
编辑:这个答案是错误的,正如Simon Byrne正确指出的那样。