2012-09-11 144 views
3

我正在尝试编写一个算法来查找使用.Net字符串格式化程序显示至少一个有效数字的精度数字的最小数目。寻找最低精度

例如。

Value  Precision wanted: 
-----  ----------------- 
10   0 
1   0 
0.1  1 
0.99  1 
0.01  2 
0.009  3 

(不关心更多的数字,只有第一个,因此0.99只需要1精度)

我能想出的最好的是:

int precision = (int)Math.Abs(Math.Min(0, Math.Floor(Math.Log10(value)))); 

这工作正常,但我不禁想到有一个更优雅的解决方案。任何数学大师能帮助我吗?

+0

“更简单”的解决方案可能会利用IEEE浮点表示法。 –

+1

NB 0.99四舍五入到一个有效数字不是0.9,它是1 - 我不确定你是否介意这一点。 – Rawling

+0

@Rawling指出,但我实际上没有显示值谢谢。 – GazTheDestroyer

回答

3

稍短:

int precision = (int)Math.Max(0, -Math.Floor(Math.Log10(value))); 
1

浮法是分数值的二进制表示。如果您的初始值是单精度浮点数,那么这个数是由指数相乘得到的值,

((f & 0x7f800000) >> 23)-127 . 

如果指数非负,根据你所说的,你会回来零(你有小数点前的数字)。

如果指数为负数,那么这很烦人,因为二进制数字与小数不一致。不过,它应该可以通过查找表来实现。检查出https://math.stackexchange.com/questions/3987/how-to-calculate-the-number-of-decimal-digits-for-a-binary-number#4080

编辑:你应该了解浮点数的存储方式。