查找最小精度

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

这样做很好,但我想有更加优雅的解决方案。有数学大牛可以帮忙吗?


一个“简单”的解决方案可能会利用IEEE浮点表示。 - Stephen Garle
1
NB 0.99 四舍五入到一位有效数字不是 0.9,而是 1 - 我不确定你是否介意这个。 - Rawling
@Rawling 注意到了,但我实际上并没有显示值,谢谢。 - GazTheDestroyer
2个回答

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接