如何获得浮点数的小数精度?
How do I get the decimal precision of a floating point number?
如何在Swift中获取浮点数的小数精度?所有现有答案都使用某种形式的字符串转换,效率低下。我是专门找一个不涉及字符串转换的方法。
这个问题是基于一个误解。感谢@MartinR 和@SimonByrne,我已经意识到并纠正了我的理解错误。
方法如下:
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 正确指出的那样,这个答案是错误的。
正如其他评论者所指出的那样,实际上并没有像 "decimal precision" 这样的浮点数:当你写类似 x = 0.123
的东西时,你实际上是在设置 [=11] =] 是最接近 0.123 的双精度浮点数,实际上是:
0.1229999999999999982236431605997495353221893310546875
根据您提出的答案,您的问题将更准确地表述为计算浮点数 近似值 的最小小数位数。
为此,您的代码对于 "reasonable" 值应该是正确的,但如果您的小数位数超过 22 位,您可能会看到一些错误,因为 tens
变量将不再准确(10 23 无法用双精度浮点数精确表示)。有关这方面的更多详细信息,您应该阅读二进制到十进制的转换:我建议您查看 Rick Regan 的网页:
http://www.exploringbinary.com/tag/convert-to-decimal/
如何在Swift中获取浮点数的小数精度?所有现有答案都使用某种形式的字符串转换,效率低下。我是专门找一个不涉及字符串转换的方法。
这个问题是基于一个误解。感谢@MartinR 和@SimonByrne,我已经意识到并纠正了我的理解错误。
方法如下:
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 正确指出的那样,这个答案是错误的。
正如其他评论者所指出的那样,实际上并没有像 "decimal precision" 这样的浮点数:当你写类似 x = 0.123
的东西时,你实际上是在设置 [=11] =] 是最接近 0.123 的双精度浮点数,实际上是:
0.1229999999999999982236431605997495353221893310546875
根据您提出的答案,您的问题将更准确地表述为计算浮点数 近似值 的最小小数位数。
为此,您的代码对于 "reasonable" 值应该是正确的,但如果您的小数位数超过 22 位,您可能会看到一些错误,因为 tens
变量将不再准确(10 23 无法用双精度浮点数精确表示)。有关这方面的更多详细信息,您应该阅读二进制到十进制的转换:我建议您查看 Rick Regan 的网页:
http://www.exploringbinary.com/tag/convert-to-decimal/