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))));

这很好用,但我不禁想到有一个更优雅的解决方案。有没有数学高手可以帮帮我?

4

2 回答 2

3

略短:

int precision = (int)Math.Max(0, -Math.Floor(Math.Log10(value)));
于 2012-09-11T14:56:19.803 回答
1

浮点数是小数值的二进制表示。如果您的初始值是单精度浮点数,则将该数字乘以指数以得到该值,

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

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

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

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

于 2012-09-11T17:08:10.220 回答